繁体   English   中英

并发java

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM