为什么在Boolean上同步不是一个好习惯?

我的建筑师总是说


永远不要同步布尔值


我无法理解原因,如果有人可以举例说明为什么这不是一个好习惯,我将不胜感激。 参考样本代码


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

      }

   }

}


慕桂英546537
浏览 261回答 3
3回答

慕容708150

private Boolean isOn = false;public void doSomeStuffAndToggleTheThing(){   synchronized(isOn){这是一个可怕的主意。isOn将引用与Boolean.FALSE公开可用的对象相同的对象。如果其他任何编写错误的代码也决定锁定该对象,则两个完全不相关的事务将不得不彼此等待

慕神8447489

我认为您的问题更多是同步本身,而不是布尔值同步。想象一下,每个线程都是一条道路,语句(汽车)在其中一条接一条。在某个点上可能有交叉点:如果没有信号灯,可能会发生冲突。Java语言有一种内置的描述方式:由于任何对象都可以是交集,因此任何对象都有一个关联的监视器充当信号灯。在代码中使用同步时,您将创建一个信号量,因此,您必须对所有道路(线程)使用相同的信号量。因此,此问题并不是真正的布尔特定的,因为仅存在两个布尔值,因此每次在实例变量上进行同步然后将同一变量指向另一个对象时,都会发生此问题。因此,您的代码使用布尔运算是错误的,但是使用整数则同样危险,
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java