Boz*_*zho 226
当多个线程需要检查并更改布尔值时.例如:
if (!initialized) {
initialize();
initialized = true;
}
Run Code Online (Sandbox Code Playgroud)
这不是线程安全的.您可以使用AtomicBoolean以下方法修复它:
if (atomicInitialized.compareAndSet(false, true)) {
initialize();
}
Run Code Online (Sandbox Code Playgroud)
Ara*_*ram 50
以下是我所做的笔记(来自Brian Goetz的书)可能对你有所帮助
AtomicXXX课程
提供无阻塞比较和交换实现
利用硬件提供的支持(英特尔的CMPXCHG指令)当许多线程运行使用这些原子并发API的代码时,它们将比使用对象级监视器/同步的代码更好地扩展.因为,Java的同步机制使代码等待,当有许多线程在关键部分运行时,花费大量的CPU时间来管理同步机制本身(等待,通知等).由于新API使用硬件级别构造(原子变量)和等待和锁定自由算法来实现线程安全性,因此花费更多的CPU时间来"做事"而不是管理同步.
不仅提供更好的吞吐量,而且它们还提供更强的抵抗活动问题,如死锁和优先级倒置.
Joh*_*int 34
有两个主要原因可以使用原子布尔值.首先它是可变的,你可以将它作为引用传递,并改变与布尔本身相关联的值,例如.
public final class MyThreadSafeClass{
private AtomicBoolean myBoolean = new AtomicBoolean(false);
private SomeThreadSafeObject someObject = new SomeThreadSafeObject();
public boolean doSomething(){
someObject.doSomeWork(myBoolean);
return myBoolean.get(); //will return true
}
}
Run Code Online (Sandbox Code Playgroud)
并在someObject类中
public final class SomeThreadSafeObject{
public void doSomeWork(AtomicBoolean b){
b.set(true);
}
}
Run Code Online (Sandbox Code Playgroud)
更重要的是,它的线程安全并且可以向维护该类的开发人员指出,该变量应该被修改并从多个线程读取.如果不使用AtomicBoolean,则必须通过声明volatile或在字段的读写周围进行同步来同步您正在使用的布尔变量.
Cam*_*ner 18
该AtomicBoolean班给你,你可以原子更新一个布尔值.当多个线程访问布尔变量时使用它.
在java.util.concurrent.atomic包概述给你的东西在这个包中的类做和何时使用它们好高层次的描述.我还推荐Brian Goetz 撰写的Java Concurrency in Practice一书.
摘自包装说明
包java.util.concurrent.atomic description:一个小型的工具包,支持对单个变量进行无锁线程安全编程.[...]
这些方法的规范使实现能够采用当代处理器上可用的高效机器级原子指令.[...]
类AtomicBoolean,AtomicInteger,AtomicLong和AtomicReference的实例都提供对相应类型的单个变量的访问和更新.[...]
访问和更新原子的记忆效应通常遵循挥发物的规则:
- get具有读取volatile变量的记忆效应.
- set具有写入(赋值)volatile变量的记忆效应.
- weakCompareAndSet以原子方式读取并有条件地写入变量,相对于该变量上的其他内存操作进行排序,但另外作为普通的非易失性存储器操作.
- compareAndSet和所有其他读取和更新操作(如getAndIncrement)都具有读取和写入volatile变量的内存效果.
| 归档时间: |
|
| 查看次数: |
121746 次 |
| 最近记录: |