为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕桂英546537 2019-12-15 11:12:00
我的建筑师总是说永远不要同步布尔值我无法理解原因,如果有人可以举例说明为什么这不是一个好习惯,我将不胜感激。 参考样本代码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公开可用的对象相同的对象。如果其他任何编写错误的代码也决定锁定该对象,则两个完全不相关的事务将不得不彼此等待


查看完整回答
反对 回复 2019-12-16
?
慕神8447489

TA贡献1780条经验 获得超1个赞

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


查看完整回答
反对 回复 2019-12-16
  • 3 回答
  • 0 关注
  • 260 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信