为线程安全项目编程时,如何确定哪个字段应该是线程安全的。例如,我们在多线程项目中有一个名为TestThreadSafe的项目中的类。
public class TestThreadSafe {
public AtomicLong pCounter = new AtomicLong();
public AtomicLong mCounter = new AtomicLong();
protected final ConcurrentMap<K, V> Map = new ConcurrentHashMap<K, V>();
private ScheduledExecutorService ses;
private String dir;
}
这里,为什么不将ses和dir定义为final或volatile字段?
答案 0 :(得分:1)
主要提示:
final
volatile
AtomicXXX
湾如果您要保护代码块,请使用synchronized
或Lock API 您可以找到有关高级并发构造here
的更多详细信息相关的SE问题:
What is the difference between atomic / volatile / synchronized?
答案 1 :(得分:0)
将字段标记为OAuth
总是好的(您不会失去任何性能,但获得编译时间检查和线程相关奖励 - 字段将始终具有给定值,而不是默认值)
对于AFOAuthCredential
- 它会使CPU优化(缓存)消失,因此使用此类字段会更慢。
final
- 其中一个线程正在向其写入数据,而多个(> = 1)线程从该线程读取。