需要同步布尔成员变量的设置?
2022-09-04 22:38:17
嘿,大家好,我正在处理一些我继承的代码,看起来一个线程正在设置一个布尔成员变量,而另一个线程正在一个ath循环中检查它。这实际上是否正常工作,或者我应该将其更改为在布尔变量上使用同步 getter 或 setter?
嘿,大家好,我正在处理一些我继承的代码,看起来一个线程正在设置一个布尔成员变量,而另一个线程正在一个ath循环中检查它。这实际上是否正常工作,或者我应该将其更改为在布尔变量上使用同步 getter 或 setter?
在阅读和编写像 bool 或 int 这样的原语的情况下,声明它们是不稳定的将会很多。当一个线程读取时,另一个线程将完成写入。该变量永远不会处于无效状态。
可以公平地说,总的来说,Java中的易失性关键字记录很差,理解很差,很少使用。更糟糕的是,从Java 5开始,它的正式定义实际上发生了变化。从本质上讲,volatile 用于指示变量的值将由不同的线程修改。
声明易失性 Java 变量意味着:
- 此变量的值永远不会在线程本地缓存:所有读取和写入将直接进入“主内存”;
- 对变量的访问就像它被包含在一个同步的块中,在它本身上同步。
我们在第二点中说“好像”,因为至少对于程序员来说(可能在大多数JVM实现中),没有涉及实际的锁定对象。
http://www.javamex.com/tutorials/synchronization_volatile.shtml
几乎可以肯定的是,您需要在更高的级别上添加锁定。仅仅添加对字段的单次访问很少有帮助。如果组件操作是独立的线程安全,则复合操作将不是线程安全的。synchronized
例如,考虑删除线程安全文档的内容。该文档提供了两个相关的线程安全操作:删除两个索引之间的内容和长度操作。所以你得到长度,从零到长度删除,对吧?好吧,有一场竞赛,因为文档可能会在读取长度和删除内容之间改变长度。给定这些操作,没有办法使操作线程安全。(示例取自 Swing Text。