我的建筑师总是说
永远不要在布尔上同步
我无法理解其中的原因,如果有人可以用一个例子来解释为什么它不是一个好的做法,我会非常感激. 参考样本代码
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
}
}
}
Run Code Online (Sandbox Code Playgroud) 从版本8开始,Java具有基于值的类的概念.这是为了准备将来很可能允许定义值类型的未来版本.两个定义/描述都提到序列化(我添加的粗体):
关于现有的基于价值的课程:
如果程序试图将两个引用区分为基于值的类的相等值,无论是直接通过引用相等还是间接通过引发同步,身份哈希,序列化或任何其他身份敏感机制,程序可能会产生不可预测的结果.
关于未来的价值类型:
通过System.identityHashCode提供的对象的默认基于身份的哈希代码也不适用于值类型.像序列化这样的内部操作会对对象进行基于身份的区分,这些操作要么不适用于值(因为它们不适用于基元),要么它们将使用值类型的hashCode方法提供的基于值的区别.
因为未来的JVM实现可能不会使用对象标头和基于值的类的引用指针,所以一些限制很明显.(例如,没有锁定JVM必须不支持的标识.锁定的引用可以被删除并在以后被另一个替换,这使得释放锁定毫无意义并将导致死锁).
但我不知道序列化如何发挥作用.为什么它被认为是"身份敏感机制"?为什么它"以对象为基础进行基于身份的区分"?