Java'da hangi işlemler atomik kabul edilir?


Yanıtlar:


100
  • uzun ve çift hariç ilkel türlerin tüm atamaları
  • tüm referans atamaları
  • uçucu değişkenlerin tüm atamaları
  • java.concurrent.Atomic * sınıflarının tüm işlemleri

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 .


21
İçin Atamalar volatileuzun ve çiftlerde atomik olması garanti edilir: java.sun.com/docs/books/jls/third_edition/html/memory.html#17.7
Joonas Pulakka

12
Ayrıca, operasyonlar atom ise özel bakım alınmadığı takdirde, bu işlemlerin görünürlüğü çok evreli bir uygulamada garanti edilemez olabileceğini aklınızda bulundurun (burada detaylar yolu yorumunda tanımlamak için karmaşık için ..)
nos

5
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ı?
maaartinus

4
Spesifikasyon hala 64 bit JVM'lerin uzun ve çift atamalara atomiklik sağladığını zorunlu kılmaz. java.sun.com/docs/books/jls/third_edition/html/memory.html#17.7 Ünlü sözleriyle, "bu davranış uygulamaya özeldir". Bununla birlikte, 64-bit VM'ler bunu atomik bir işlem olarak uygular.
sjlee

1
IMHO, normal referans atamaları atomiktir, ancak AtomicReference daha fazlasını sunar: CompareAndSet ve getAndSet, senkronizasyon olmadan başka türlü elde edemeyeceğiniz bir şey.
maaartinus

5

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;
           } 
  }

5
..threadsafe, yani değer her zaman tam olarak ya orijinal değer ya da ayar değeri olacaktır. "Uçucu" veya "senkronize" olmadığından, güncel değerlerin çoğu diğer iş parçacıkları tarafından görülmez.
Mikko Wilkman

1
@ MikkoWilkman'ın söylediklerine +1. Bu kod parçası, bellek görünürlüğü açısından kesinlikle iş parçacığı açısından güvenli olmadığı için kullanılmamalıdır.
Knuckles the Echidna

0

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.


3
Beyannamesine bakın value. Bu volatile.
maaartinus

2
Yani valuebir volatileatama yapmaz valueatom, bu sadece önler "yayın" konularında.
Lyle Z

7
Her ikisini de yapar, bakınız JLS, bölüm 17.7 : Uçucu uzun ve çift değerler her zaman atomiktir ve okur.
maaartinus

@LyleZ bence bu konudaki en değerli yorum.
stdout'u
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.