线程安全的实例字段

时间:2016-07-21 08:03:02

标签: java multithreading thread-safety

为线程安全项目编程时,如何确定哪个字段应该是线程安全的。例如,我们在多线程项目中有一个名为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字段?

2 个答案:

答案 0 :(得分:1)

主要提示:

  1. 如果您的变量未被多个线程修改,请不要使用任何内容
  2. 如果您的变量引用在创建后没有更改,请使用final
  3. 如果您的变量由单个线程修改并由其他线程访问,请使用volatile
  4. 如果您的变量被多个线程修改和访问: 一个。如果您的操作是Atomic - 单步交易,请使用AtomicXXX 湾如果您要保护代码块,请使用synchronizedLock API
  5. 您可以找到有关高级并发构造here

    的更多详细信息

    相关的SE问题:

    What is the difference between atomic / volatile / synchronized?

    What is meant by "thread-safe" code?

答案 1 :(得分:0)

将字段标记为OAuth总是好的(您不会失去任何性能,但获得编译时间检查和线程相关奖励 - 字段将始终具有给定值,而不是默认值)

对于AFOAuthCredential - 它会使CPU优化(缓存)消失,因此使用此类字段会更慢。

如果在线程之间共享给定的字段值,则应使用

final - 其中一个线程正在向其写入数据,而多个(> = 1)线程从该线程读取。