AtomicBoolean使用本机代码进行同步。如何将其转换为java锁?
这两者有什么不同:
AtomicBoolean a = new AtomicBoolean();
synchronized (a) {
a.set(true);
}vs:
a.set(true)我知道synchronized(a)是不需要的,因为a本身将确保操作是原子的。但是,synchronized中的锁(a)是否与a.set中的锁(True)相同?
发布于 2013-07-02 13:35:06
原子在某些情况下依赖于JVM,例如在set/get中,但在其他情况下依赖于sun.misc.Unsafe类。您可以在以下位置查看代码:
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/atomic/AtomicBoolean.java
它也值得一看:
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/misc/Unsafe.java#Unsafe
它用于JDK中的很多东西,尽管不幸的是它不是一个公共类。变得更加悲哀,因为它的名称是如此明显,以至于它可以是公共的,并且可以完全“安全”地使用;-)
我要补充的是,原子类的整个思想是为了避免锁和同步,这通常会提高性能。您不需要使用锁来保护它们,但在使用锁时可能会依赖compareAndSwap或incrementAndGet (针对数字)等非标准操作。
发布于 2013-07-02 13:41:48
不是的。事实上,所有的atomic classes,AtomicBoolean都使用compare-and-swap来保证原子性。
发布于 2013-07-02 13:38:04
这一点:
a.set(true);中的根本不是内部同步的,看看JDK1.7中的AtomicBoolean.java代码(来自src.zip):
/**
* Unconditionally sets to the given value.
*
* @param newValue the new value
*/
public final void set(boolean newValue) {
value = newValue ? 1 : 0;
}因此,是的,它与同步版本不同
https://stackoverflow.com/questions/17418001
复制相似问题