2013-03-17 30 views
7

Bu java uçucusunun sıralı tutarlı fakat atomik olmadığını okudum. Atomiklik için java farklı bir kütüphane sağlar.Sıralı tutarlılık ve atomiklik arasındaki fark nedir?

Birisi, basit ingilizce, iki arasındaki farkı açıklayabilir mi?

(Ben soru kapsamı C/C içeren ++ ve dolayısıyla bu dil etiketleri ekleyerek daha büyük bir kitleye almak inanıyoruz.)

+0

Bu 'volatile', C/C++ ile aynı garantiyi Java'da sağladığını düşünmüyorum. Özellikle, C'ye ardışık tutarlılık dediğiniz şeyi sağladığını düşünmüyorum (yani bellek çiti diğer değişkenler için de geçerlidir) - TBC. – assylias

+1

@assylias C/C++ 'da volatile aynı anlama sahip demek istemedim. Eminim öyle değil.C/C++ ve Java arasında yaygın olan 'sıralı tutarlılık ve atomisite' kavramına atıfta bulundum. C/C++ uçucu anahtar sözcüğü değişken kullanımın optimizasyonunu durdurur ve bir değişken değişken ile işlemden önce belirtilen işlemler arasında sıralı tutarlılık sağlamak için kullanılmaz .. –

cevap

7

bir sınıfta bu iki değişken düşünün:

int i = 0; 
volatile int v = 0; 

Ve bu iki yöntem

void write() { 
    i = 5; 
    v = 2; 
} 

void read() { 
    if (v == 2) { System.out.println(i); } 
} 

uçucu semantik read ya baskı 5 ya da hiçbir şey (varsayarak başka hiçbir yöntemler değiştiriyorsanız garanti sahalar). v uçucu değilse, da i = 5 ve v = 2 yeniden düzenlenmiş olabilir yazdırmak olabilir. Sanırım, daha geniş bir anlamı olan sıralı tutarlılık ile demek istediğin buydu. Diğer taraftan, uçucu, atomikliği garanti etmemektedir. İki iş parçacığı aynı anda bu yöntemi çağırmak Yani eğer (v aynı volatile int olan):

load v; 
increment v; 
store v; 
:

void increment() { 
    v++; 
} 

Eğer 2. artırılır v garanti edemezsin v++ aslında üç ifadeleri olmasıdır

ve iplik araya sokma nedeniyle v sadece bir kez artırılabilir (her iki iplik aynı değeri yükler).

+0

Atomik ve ardışık olan bir şey gösterecek bir örnek ekleyebilirseniz tam bir cevap olurdu. Muteks kullanmadan yapabilir miyiz? –

+1

Şu anda güncellenemiyor ancak evet, cslled kilitlenmeyen algoritmalar atomizasyon sağlamak için CAS işlemlerini kullanır. Java'daki tüm AtomicXXX sınıfları tarafından kullanılır. – assylias

5

bu iki değişken olduğunu varsayalım:

public int a = 0; 
public volatile int b = 0; 

Ve bir iplik

yapar varsayalım başka bir iş parçacığı bu değerleri okur ve == 2 b, o zaman da bir == görmek pilli görürse
a = 1; 
b = 2; 

1.

Ancak okuma iş parçacığı a == 1 ve b == 0 görebildi, çünkü iki yazma işlemi bir atomik işlemin parçası değil, bu nedenle okuma iş parçacığı, ilk iş parçacığı b için bir değer atamadan önce a için yapılan değişikliği görebiliyordu.

bu iki değişken erişimi eşitlemek gerekir, bu iki yazma atomik yapmak için:
synchronized (lock) { 
    a = 1; 
    b = 2; 
} 

... 

synchronized (lock) { 
    System.out.println("a = " + a + "; b = " + b); 
} 

Ve bu durumda

, okuma ipliği a == 0 ve b == 0 veya a == 1 ve b == 2 görürsünüz, ancak asla ara devlet değildir.

+2

+1, ama gerçekten "bu sıralı değil tutarlılık "ve" bu atomisitedir ". – Dukeling

+0

Evet, bunun açık olduğunu varsaydım. Ancak assylias'ın cevabı, her şeyden daha net ve daha iyi. –

İlgili konular