如果多个线程可以访问某个字段,那么它应该标记为volatile吗?

Poo*_*ool 8 java memory atomic volatile

阅读几个线程(常见的并发问题,volatile关键字,内存模型)我对Java中的并发问题感到困惑.

我有很多字段可以被多个线程访问.我是否应该通过它们并将它们标记为易变?

在构建一个类时,我不知道多个线程是否会访问它,所以让任何字段都不易变化是不安全的,所以根据我的理解,你很少会使用它.它是否正确?

对我来说,这是特定于版本1.5 JVM及更高版本,但不仅限于回答我的具体设置.

eri*_*son 3

如果一个字段被多个线程访问,它应该是volatileor final,或者只能通过同步块访问。否则,分配的值可能对其他线程不可见。

一个类必须专门设计用于多个线程的并发访问。简单地将字段标记为 volatile 或 Final 不足以保证线程安全。存在一致性问题(多个字段更改的原子性)、线程间信号传递的问题(例如使用waitand notify)等。

因此,最安全的做法是假设一个对象应该仅对单个线程可见,除非另有说明。使所有对象都线程安全是没有必要的,而且成本高昂——就软件速度而言,但更重要的是,就开发费用而言。

相反,软件的设计应使并发线程之间的交互尽可能少,最好根本不交互。需要清楚地识别它们交互的点,以便设计适当的并发控制。