Java'da hangi işlemler atomik kabul edilir?
Yanıtlar:
ve belki daha fazlası. Bak JLS .
Yorumlarda belirtildiği gibi, atomiklik görünürlük anlamına gelmez. Bu nedenle, başka bir iş parçacığının kısmen yazılmış bir iş parçacığı görmemesi garanti edilirken int
, yeni değeri asla göremeyebilir.
Uzun ve çift üzerinde operasyonlar ortak 64 bit CPU üzerinde sıra atomik garantisi yok, ancak. Ayrıca bu özellik isteğine bakın .
64 bit jvm, long and double assignments are also atomic.
Emin misiniz? Derlenmiş kod için olduklarını söyleyebilirim, peki ya yorumlanmış kod? Muhtemelen haklısın, ama herhangi bir garanti var mı?
Java'da, 32 bit veya daha küçük miktarların okunması ve yazılması atomik garanti edilir.
Atomik derken, her eylemin tek adımda gerçekleştiğini ve kesintiye uğramayacağını kastediyoruz. Bu nedenle, çok iş parçacıklı uygulamalarımız olduğunda, okuma ve yazma işlemleri iş parçacığı açısından güvenlidir ve senkronize edilmelerine gerek yoktur.
Örneğin, aşağıdaki kod iş parçacığı açısından güvenlidir:
public class ThreadSafe
{
private int x;
public void setX(int x)
{
this.x = x;
}
}
Olur görünmek uzun ürün atamaları AtomicLong.java bu yöntemine dayalı, atom olduğu:
public final void set(long newValue) {
value = newValue;
}
Herhangi bir senkronizasyon olmadığına dikkat edin.
value
. Bu volatile
.
value
bir volatile
atama yapmaz value
atom, bu sadece önler "yayın" konularında.
volatile
uzun ve çiftlerde atomik olması garanti edilir: java.sun.com/docs/books/jls/third_edition/html/memory.html#17.7