我的建筑师总是说永远不要同步布尔值我无法理解原因,如果有人可以举例说明为什么这不是一个好习惯,我将不胜感激。 参考样本代码private Boolean isOn = false;private String statusMessage = "I'm off";public void doSomeStuffAndToggleTheThing(){ // Do some stuff synchronized(isOn){ if(isOn){ isOn = false; statusMessage = "I'm off"; // Do everything else to turn the thing off } else { isOn = true; statusMessage = "I'm on"; // Do everything else to turn the thing on } }}
3 回答
慕容708150
TA贡献1831条经验 获得超4个赞
private Boolean isOn = false;
public void doSomeStuffAndToggleTheThing(){
synchronized(isOn){
这是一个可怕的主意。isOn将引用与Boolean.FALSE公开可用的对象相同的对象。如果其他任何编写错误的代码也决定锁定该对象,则两个完全不相关的事务将不得不彼此等待
慕神8447489
TA贡献1780条经验 获得超1个赞
我认为您的问题更多是同步本身,而不是布尔值同步。想象一下,每个线程都是一条道路,语句(汽车)在其中一条接一条。在某个点上可能有交叉点:如果没有信号灯,可能会发生冲突。Java语言有一种内置的描述方式:由于任何对象都可以是交集,因此任何对象都有一个关联的监视器充当信号灯。在代码中使用同步时,您将创建一个信号量,因此,您必须对所有道路(线程)使用相同的信号量。因此,此问题并不是真正的布尔特定的,因为仅存在两个布尔值,因此每次在实例变量上进行同步然后将同一变量指向另一个对象时,都会发生此问题。因此,您的代码使用布尔运算是错误的,但是使用整数则同样危险,
添加回答
举报
0/150
提交
取消