2013-07-02 1 views
2

AtomicBoolean использует собственный код для синхронизации. Как это переводится в java locks?AtomicBoolean, где находится замок?

что разница между:

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

против:

a.set(true) 

Я знаю, что синхронное (а) не требуется, поскольку само по себе гарантирует, что операция является атомарной. Но является ли синхронизация синхронизированной (a) той же блокировкой, что и в a.set (true)?

ответ

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 (для чисел), которые не являются стандартными при использовании блокировки.

0

это:

a.set(true); 

внутренне не синхронизированы на всех, взглянуть на код AtomicBoolean.java в JDK 1.7 (от src.zip):

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

поэтому, да, это отличается от синхронизированной версии

1

AtomicBoolean, по сути, все atomic classes, используйте compare-and-swap, чтобы гарантировать атомизм.

+0

Да, но по-прежнему отличается, он не синхронизируется с объектом, как замок, он использует внутреннюю инструкцию JVM. – morgano

+0

@mogano Я никогда не говорил, что он взял объект в качестве замка. CAS реализуется с помощью класса 'Unsafe' с помощью метода' native'. – Jeffrey

+0

Предоставлено, но я сосредоточился на вопросе в конце сообщения (независимо от того, были ли они одним и тем же замком). – morgano

0

Ключевое слово синхронизации предоставляет три гарантии в соответствии с JMM. 1. Атомарность 2. Видимость 3. Переупорядочение

, но синхронизация блокируется на природе.

Все атомные классы в Java, такие как AtomicInteger, AtomicLong, AtomicBoolean и т. Д. также предоставляют три вышеуказанные гарантии. Но они не блокируют другие темы.

Они обеспечивают 1. Атоматичность - с помощью операции compareAndSwap. 2. Видимость и переупорядочение - это предоставление путем объявления базовой переменной как изменчивой.

, например, в AtomicInteger основной INT переменная объявлена ​​как летучего

private volatile int value; 
+0

Первичная «проблема» с кодом блокировки - это то, что поток, который убирается между временем, когда он получает блокировку и время это может привести к тому, что прогресс других потоков будет заблокирован на неопределенный срок. Классы 'Atomic' гарантируют, что любая аппаратная« блокировка », которая будет получена во время операции, будет выпущена за очень короткое время *, и ничто из того, что может вызвать поток, не сможет избежать этого *. – supercat