阅读几个主题(
common concurrency problems,volatile keyword,memory model)我对Java中的并发问题感到困惑.
@H_301_2@我有很多字段可以被多个线程访问.我是否应该通过它们并将它们标记为易变?
@H_301_2@在构建一个类时,我不知道多个线程是否会访问它,所以让任何字段都不易变化是不安全的,所以根据我的理解,你很少会使用它.它是否正确?
@H_301_2@对我来说,这是特定于版本1.5 JVM及更高版本,但不仅限于回答我的具体设置.
解决方法
如果一个字段由多个线程访问,则它应该是volatile或final,或者仅使用synchronized块访问.否则,其他线程可能看不到指定的值.
@H_301_2@必须专门为多线程的并发访问设计类.简单地标记易失性或最终的字段对于线程安全是不够的.存在一致性问题(多个字段的更改的原子性),关于线程间信令的关注(例如,使用等待和通知)等.
@H_301_2@因此,最安全的做法是假设一个对象应该只对单个线程可见,除非另有说明.使所有对象都是线程安全的并不是必需的,并且在软件速度方面成本很高,但更重要的是,在开发费用方面.
@H_301_2@相反,软件的设计应使并发线程尽可能少地相互交互,最好不要.需要清楚地识别它们进行交互的点,以便可以设计适当的并发控制.