我正在阅读J.Bloch的有效Java,现在我正在关于记录线程安全的部分。他提供了一个使用锁的例子:
ab
并说:
请注意,
private final Object lock = new Object(); public void foo(){ synchronized(lock){ ... } }
字段已声明为lock
。这可以防止你 无意中改变了其内容,这可能导致 对包含对象的灾难性非同步访问。
我们是否应该坚持规则总是声明锁定对象最终?从第一眼看,我可以看到,如果一个线程修改了synchronized块中的final
,并且其他一些线程在修改后立即尝试获取修改对象的监视器(它是免费的)。但在我看来,这是一个理论问题"很难在实践中复制。也许我错过了什么?