首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AtomicBoolean锁在哪里?

AtomicBoolean锁在哪里?
EN

Stack Overflow用户
提问于 2013-07-02 13:30:27
回答 4查看 2.7K关注 0票数 2

AtomicBoolean使用本机代码进行同步。如何将其转换为java锁?

这两者有什么不同:

代码语言:javascript
复制
AtomicBoolean a = new AtomicBoolean();
synchronized (a) {
   a.set(true);
}

vs:

代码语言:javascript
复制
a.set(true)

我知道synchronized(a)是不需要的,因为a本身将确保操作是原子的。但是,synchronized中的锁(a)是否与a.set中的锁(True)相同?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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 (针对数字)等非标准操作。

票数 4
EN

Stack Overflow用户

发布于 2013-07-02 13:41:48

不是的。事实上,所有的atomic classesAtomicBoolean都使用compare-and-swap来保证原子性。

票数 1
EN

Stack Overflow用户

发布于 2013-07-02 13:38:04

这一点:

代码语言:javascript
复制
a.set(true);

中的根本不是内部同步的,看看JDK1.7中的AtomicBoolean.java代码(来自src.zip):

代码语言:javascript
复制
/**
 * Unconditionally sets to the given value.
 *
 * @param newValue the new value
 */
public final void set(boolean newValue) {
    value = newValue ? 1 : 0;
}

因此,是的,它与同步版本不同

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17418001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档