[英]concurrency java
static ConcurrentHashMap k;
X x;
//line 3:
synchronized(k){ x = k.get("LL");}
// line 5
// line 12:
synchronized(k){if(x.b){x.b = false;}}
“ k”是共享的地图。 当线程1位于第5行时,第一个线程经过第3行,第二个线程经过第3行,线程一将xb更改为false,线程2看到了什么xb? 第5行旨在表明线程2在线程1进入第二个同步块之前先获得其x
您对术语“第一线程”和“第二线程”的定义有些过高; 您的问题假设,第一个进入第一个synchronized
块的线程也将是第一个进入第二个synchronized
块的线程,但是实际上没有理由期望。
但是,第一个synchronized
块没有做任何非常相关或有趣的事情-代码段中的任何内容都不会使k
突变,而第一个synchronized
块仅访问它-因此,我将忽略它已synchronized
的事实。 这将稍微简化定义:现在,“第一个线程”表示进入第二个synchronized
块的第一个线程,而“第二个线程”表示进入第二个synchronized
块的第二个线程。 (到目前为止还好吗?)这个定义问题不重要。 。 。
假设没有其他线程进入并将xb
设置为true
的可能性,或者就此而言,第一个线程这样做的可能性是,在引述摘录之后的代码中,同样,两个线程也没有可能由于其他地方发生的事情, k.get("LL")
结果完全不同-然后第二个线程将xb
视为false
,就像一个天真的期望那样。 这是因为
如果一个动作发生在另一个动作之前 ,则第一个动作对第二个动作可见,并在第二个动作之前排序。
和
监视器上的解锁发生在该监视器上的每个后续锁定之前 。
(以上两个引文均来自Java语言规范 Java SE 7 Edition的§17.5.5 ;有关更多形式,请参见该部分及其前面的部分。)
解释尚不清楚,但这是我的理解。
由于线程1位于第5行(已经通过第3行)并且尚未到达第12行(并且您的说法在3到12之间,因此线程1将xb设置为false),因此线程2应该将xb视为刚刚设置的任何线程它(错误)。 尽管我看不到线程2实际上在乎在第3行中看到xb。而且我不清楚为什么第5行(我看不到)为什么不同步,但是将其设置为false的第12行是同步的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.