【问题标题】:AtomicBoolean where is the lock?AtomicBoolean 锁在哪里?
【发布时间】:2013-06-29 08:56:53
【问题描述】:

AtomicBoolean 使用本机代码进行同步。怎么翻译成java锁?

两者有什么区别:

AtomicBoolean a = new AtomicBoolean();
synchronized (a) {
   a.set(true);
}

对比:

a.set(true)

我知道 synchronized(a) 是不需要的,因为 a 本身将确保操作是原子的。但是 synchronized (a) 中的锁和 a.set(true) 中的锁是一样的吗?

【问题讨论】:

    标签: java locking synchronized atomicboolean


    【解决方案1】:

    同步关键字根据JMM提供三包。 1. 原子性 2. 能见度 3. 重新排序

    但同步本质上是阻塞的。

    Java 中的所有原子类,如 AtomicInteger、AtomicLong、AtomicBoolean 等 同时提供上述三项保障。 但它们不会阻塞其他线程。

    他们提供 1. 原子性 - 通过使用 compareAndSwap 操作。 2. 可见性和重新排序 - 这些是通过将基础变量声明为 volatile 来提供的。

    例如在 AtomicInteger 中,底层 int 变量被声明为 volatile

    private volatile int value;
    

    【讨论】:

    • 锁定代码的主要“问题”是一个线程在它获得锁和释放它之间被阻塞可能会导致其他线程的进程被无限期地阻塞。 Atomic 类保证在操作期间获得的任何硬件“锁定”都将在很短的时间内释放并且任何可能导致线程被阻塞的东西都无法阻止
    【解决方案2】:

    没有。 AtomicBoolean,其实就是所有的atomic classes,用compare-and-swap保证原子性。

    【讨论】:

    • 是的,但还是不一样,它不会同步将对象作为锁,而是使用内部JVM指令。
    • @mogano 我从来没有说过它将对象作为锁。 CAS 是通过Unsafe 类和native 方法实现的。
    • 当然,但我关注的是帖子末尾的问题(它们是否是同一个锁)
    【解决方案3】:

    这个:

    a.set(true);
    

    内部根本不同步,看看 JDK 1.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;
    }
    

    所以,是的,它与同步版本不同

    【讨论】:

      【解决方案4】:

      原子性在某些情况下依赖于 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(用于数字)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-23
        • 1970-01-01
        • 1970-01-01
        • 2018-09-07
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        相关资源
        最近更新 更多