将volatile关键字与包装类一起使用

All*_*t86 3 java concurrency multithreading

在Java并发类中,我建议在多线程应用程序中使用以下代码作为计数器

private volatile int count;
Run Code Online (Sandbox Code Playgroud)

我问自己是否可以将volatile关键字与包装类Integer一起使用而不是原始类型int(见下文):

private volatile Integer count;
Run Code Online (Sandbox Code Playgroud)

在这种情况下使用Integer包装类是否正确?

dka*_*zel 5

实际上两个版本都是糟糕的设计.

来自Java Concurrency in Practice p.39:

...语义volatile不够强大,无法使增量操作(count ++)原子,除非你能保证变量只能从一个线程写入.(原子变量确实提供原子读 - 修改 - 写支持,通常可以用作"更好的易变量")

所以我建议使用 AtomicInteger

private AtomicInteger count;
Run Code Online (Sandbox Code Playgroud)