AtomicInteger可以替换同步吗?
java.util.concurrent.atomic包的javadoc说明如下:
一个小型工具包,支持对单个变量进行无锁线程安全编程。
但我没有在任何AtomicInteger或AtomicBoolean类中看到任何线程安全(同步或锁定)代码。
那么,这两个是相同的:
1。
int i; synchronized(this){i++;}
2。
AtomicInteger i = new AtomicInteger(); i.getAndIncrement();
更新 :感谢您的回答。 使用AtomicInteger时是否需要volatile?
他们会提供相同的primefaces性。 你必须要注意的唯一事情是你读的时候你必须用同步包装它
synchronized(this){ return i;}
编辑以回答您的修改:
AtomicInteger不需要易失性。 要certificate声明AtomicInteger最终。 您需要AtomicInteger易变的唯一原因是AtomicInteger字段本身是否发生变化。 相近:
volatile AtomicInteger i = new AtomicInteger(0); public void work(){ i.incrementAndGet(); //...do some other stuff i = new AtomicInteger(10);//because the field i is changing the field needs to be volatile }
你可以想象不应该这样,所以你不必担心这个领域是不稳定的。
它们在function上是等价的,但有一个微妙的区别。 synchronized
具有在this
获取和释放监视器的开销,而AtomicInteger
使用本机方法调用实现,因此它将显着更快。
是的,它们在function上是等同的。
如果您处于超高争用环境中,您可能会看到性能差异,但这种可能性极小。
AtomicInteger使用下面的sun.misc.Unsafe来执行primefaces更新。
所以,回答你的问题,是的,AtomicInteger 是线程安全的 。
使用AtomicInteger时是否需要volatile?
不必要。 考虑你的例子:
- 如果
i
是一个局部变量,或者 - 如果
i
是final
属性,或者 - 如果当前线程和初始化(或最后更新)
i
变量的线程在该事件之后已同步,
如果你声明i
是不稳定的,那么它没有任何区别。
- 初始化FingerpringManager.Crypto对象,得到没有AndroidKeyStore提供程序支持的Crypto原语?
- 应用程序在Eclipse的调试/运行中工作,但.APK在解析包含自定义视图的XML布局时给出.classNotFoundException
- 在手机上测试Admob时DEVICE_ID_EMULATOR和TEST_EMULATOR之间的区别
- 我如何在Android中实现片段的通用ArrayList?
- Android Open Activity并关闭上一个
- 修剪双精度到2位小数
- 用户名和密码在Android中的RTSP流
- Android Java ServerSocket端口号不是它应该的
- 从List 填充ListView