[讨论] synchronized到底干了什么~~

gooooooooa 2012-02-14
一般了解到就是获得了一个对象的锁,一般就是this锁。

但是本质上这还是很虚的一个概念,底层到底干了什么。同一个线程可以重入,那他必定在某个地方记录了是哪个线程,不然怎么判断是同一个线程,这个记录点在哪里?

希望有高手告之详细过程。(本人探求底层初级菜鸟-__-)
RednaxelaFX 2012-02-15
一开始就钻复杂的VM的实现细节会很痛苦的哦。
HotSpot VM在monitor的实现上用了一些不一定直观的办法,所以我不太想用它来作为例子来讲。得先从直观的、简单的实现入门嘛。

Anyway,睡前简单讲讲monitor的递归锁的支持。
要支持递归锁最简单直观的办法就是在对象上记录:
1、哪个线程持有这个对象的锁
2、递归锁了多少次
这样,在一个线程上的代码尝试去锁一个对象时,先看是不是已经有别的线程锁住该对象了,是就先等着;不是的话,如果之前根本还没被锁就把自己这个线程的某种标记写到这个对象上,然后锁的次数计数器从0变为1;如果之前已经被当前线程锁住,那么直接计数器加1。释放锁则是上述过程的反过程。

很多VM都会在对象上记录一些元数据来支持锁、GC之类的功能。HotSpot VM也不例外,对象头由mark和klass两个数据构成。其中mark会在某些状态下记录当前持有该对象的锁的线程ID。

但,HotSpot VM是不在对象里记录锁的递归计数的。这里就开始有各种有趣的实现细节了。先睡觉,有空了再说,呵呵^_^
gooooooooa 2012-02-15
对于synchronized, 是在编译时,就已经是变为一种字节码指令的存在,比如
lock()什么的,还是在运行时的时候,识别到synchronized,然后再做某步操作呢。
最好能看到native的代码,呵呵

12点多睡和我差不多 -___-
zhangjun0806 2012-02-15
RednaxelaFX 写道
一开始就钻复杂的VM的实现细节会很痛苦的哦。
HotSpot VM在monitor的实现上用了一些不一定直观的办法,所以我不太想用它来作为例子来讲。得先从直观的、简单的实现入门嘛。

Anyway,睡前简单讲讲monitor的递归锁的支持。
要支持递归锁最简单直观的办法就是在对象上记录:
1、哪个线程持有这个对象的锁
2、递归锁了多少次
这样,在一个线程上的代码尝试去锁一个对象时,先看是不是已经有别的线程锁住该对象了,是就先等着;不是的话,如果之前根本还没被锁就把自己这个线程的某种标记写到这个对象上,然后锁的次数计数器从0变为1;如果之前已经被当前线程锁住,那么直接计数器加1。释放锁则是上述过程的反过程。

很多VM都会在对象上记录一些元数据来支持锁、GC之类的功能。HotSpot VM也不例外,对象头由mark和klass两个数据构成。其中mark会在某些状态下记录当前持有该对象的锁的线程ID。

但,HotSpot VM是不在对象里记录锁的递归计数的。这里就开始有各种有趣的实现细节了。先睡觉,有空了再说,呵呵^_^

那想要学习VM得相关知识应该是这样的一个学习过程呢?师兄是否可以总结性地指点一下方向,方法?
RednaxelaFX 2012-02-15
zhangjun0806 写道
那想要学习VM得相关知识应该是这样的一个学习过程呢?师兄是否可以总结性地指点一下方向,方法?

跟这楼的主线没啥关系诶,另外开一帖吧?

====================================

我也没啥好总结。感觉自己就是一路跌跌撞撞歪打正着的对VM有了一些了解而已。而且是纯兴趣驱动的。没这兴致的话还是不要在VM上太纠结的好

首先是要确定自己的动机吧。如果你的动机跟我一样是兴趣驱动的,那什么都好说。那你多半会很乐意自己动手去写很多小玩儿来验证自己的想法,同时阅读很多资料(书、论文、源码)来慢慢摸索自己能看懂什么、什么地方还差得远需要补基础之类的。

如果你只是工作上遇到了问题想靠学习底层知识来解决问题,那也行,那就碰到什么具体问题就看什么部分的资料。

如果完全没方向,也没兴趣,只是觉得VM很神秘学了可装那啥,那…我不知道了

=====================================

嗯,详细的还是请另外开一帖再说吧
RednaxelaFX 2012-02-15
gooooooooa 写道
对于synchronized, 是在编译时,就已经是变为一种字节码指令的存在,比如
lock()什么的,还是在运行时的时候,识别到synchronized,然后再做某步操作呢。

也就是说之前我回复的PM的相关内容你完全没理解…
RednaxelaFX 写道
例如synchronized,首先我会通过规范知道Java的synchronized关键字在JVM规范里规定要用配对的monitorenter/monitorexit来表示。然后我会去找找看各种JVM实现里这俩字节码是如何实现的。先在源码里文本搜索,然后慢慢缩小范围找到实际的实现;如果能配合调试那是最好。

红字回答了你的第一个问题。
至于native code,我感觉你的现状还没到需要去钻到native code看的阶段。
但如果你执意要看HotSpot VM的锁实现,我也可以告诉你代码的位置。需要不?

还是等我有空的时候写篇入门介绍吧…能等的话,呵呵
gooooooooa 2012-02-15
嗯 红字的我理解了,非常感谢。

我觉得就 Cloneable Serializable synchronized 这几个常见的,平时又不太会真正看到他底层机制的东东,写个入门篇是个很棒的想法。(抽丝剥茧,层层深入,现在想到就有点迫不及待啊)

我愿意等到 2012年12月21日
hellhell 2012-02-16
Here is one:
http://blog.hummingbird-one.com/?p=10086#comments
hellhell 2012-02-16
在ObjectMonitor的wait方法中,为什么先调用exit?这样会把_onwer置空啊,如果当时有别的thread hold这个monitor,不是有可能导致不正确的结果么?
Global site tag (gtag.js) - Google Analytics