[讨论] synchronized以及Lock的内存语义以及与happens-before的关系

freish 2012-09-07
一般使用synchronized或者Lock的时候,对于同一变量的读写,都要使用同一把锁。

synchronized或者Lock(非读锁)都可以保证互斥访问,另一个要点是保证变量的可见性。

在不少资料和书籍上都有说,大概如下,进入监视器意味着工作内存的失效(将主存同步到工作内存?抑或直接操作主存?),退出监视器意味着将工作内存同步到主存。

那么,有一个疑问,就是,若访问某个变量不需要互斥的效果,只要保证可见性(不用volatile),那么写变量v的时候加锁l1,读v的时候加锁变量l2,按照这个逻辑,可能会有一些更新被覆盖,但那些更新总是会到主存了走一遭,是这样么。

又或者读v的时候synchronized(o1),写v的时候synchronized(o2),按上面的理论,这样可见性是依然能够保证的,现实是怎样的呢。

另外一个令人头疼的问题就是happens-before与同步与可见性三者的关系是什么。网上资料和书籍很多,不过都不通俗易懂,jsr133(以及java语言规范JAVASE7版第17章)的描述更是无法理解,有没有大牛来个通俗的解释。
freish 2012-09-12
怎么没人回复呢
zhang_xzhi_xjtu 2012-10-07
你这个最好发代码上来,描述很难看清楚。
Global site tag (gtag.js) - Google Analytics