java - 原子变量与同步方法
问题描述
我有一个具有递增和递减方法的计数器类,这两种方法都是同步的。
public class Counter {
int count = 0;
public synchronized void increment(){
count++;
}
public synchronized void decrement(){
count--;
}
}
从这个例子中可以清楚地看出,竞争条件不会发生,只有一个线程可以访问增量或减量方法。
现在代替整数基元,如果我用原子整数修改计数器类并删除同步关键字,我们可以实现同样的事情吗?
public class Counter {
AtomicInteger count = new AtomicInteger();
public void increment(){
count.incrementAndGet();
}
public void decrement(){
count.decrementAndGet();
}
}
解决方案
从java-8
有一个更好的(在真正竞争的环境中读取速度更快)选项而不是 开始AtomicInteger
,它被调用LongAdder
并以相同的方式保证原子更新:
在低更新争用下,这两个类具有相似的特征(AtomicLong)。但是在高竞争下,这个类的预期吞吐量明显更高,代价是更高的空间消耗。
它的实现非常棒。用简单的英语(简体):如果线程之间没有争用,不要做一个聪明的驴子,只需像使用 AtomicLong 一样工作;如果有,请尝试为每个线程创建一个单独的工作空间,以便最大限度地减少争用。
它具有您关心的相同方法:add
和decrement
.
推荐阅读
- flutter - 是否有对 Flutter 的 Gmail API 支持?
- binding - 如何使用 jacksoon-dataformat-yaml 高效管理 Java 中的 YAML 文档?
- python - 使用胡克定律逼近 F
- python-3.x - 扭曲的单连接服务器
- c# - c# 代码返回 System.Data.DataSet 而不是 Data 本身?
- c++ - 嵌套 for 循环的外部 for 循环将在执行时被忽略
- javascript - 如何在 Leaflet 中标记类似于谷歌地图的标记
- mysql - 在 Nodejs/Express 应用程序中使用 Sequelize 查询多对多
- java - 导出延迟初始化的 bean(实现 SelfNaming 并使用 ManagedResource 注释进行注释)会产生 IllegalStateException
- c# - 使用 Run Query at Start 更快地运行应用程序