2012-04-02 13 views
6
Ben küçük karıştı

...atomik işlemler

hepsi uzun hariç \ birkaç parçacığı yazma okuma olduğu doğru mudur ve çift atom operasyonlardır ve sadece uzun olan uçucu kullanmak ve çift yüklememiz gerekiyor nelerdir operasyonlar?

+1

bir kaynak var mı başka konu hemen güncellenmesi değerini görebilirsiniz (ve dışarı optimize edilemez) gelir sadece değerini yazma dışındaki anlambilim içeriyor bunun için? – paislee

cevap

8

JLS'nin this section numaralı telefonuna atıfta bulunduğunuz anlamına gelir. Tüm ilkel türler için garanti edilir - double ve long - tüm threadlar bu değişkene gerçekten yazılan değerini görecektir. (double ve long ile, ilk dört bayt bir iş parçacığı tarafından yazılmış olabilir ve son dört bayt JLS'nin bu bölümünde belirtildiği gibi başka bir iş parçacığı tarafından yazılmıştır.) Ancak, her ikisi de aynı değerine sahip değildir. Değişken volatile işaretli değilse aynı zaman. Bir okuma ve yazma işlevi gören x = x + 3, ve okuma ve yazma arasındaki x yazar olabilir, çünkü bile volatile kullanılarak

, x += 3, atom değildir. Bu yüzden AtomicInteger ve java.util.concurrent gibi diğer yardımcı programlarımız var.

0

Bu doğru gelmiyor.

Atomik işlem, tüm iş parçacıklarını, bir başka iş parçacığı bitinceye kadar kaynağa erişmek için beklemeye zorlayan bir işlemdir. Diğer veri türlerinin neden atomik ve diğerleri olmadığını anlamıyorum.

3

Atomik parçayı güvenli bir şekilde karıştırmayın. Uzun ve çift yazarlar altta atomik değildir, çünkü her biri iki ayrı 32 bitlik depolardır. Uzun/çift olmayan alanların depolanması ve yüklenmesi, bunların bir bileşik yazma (örneğin, i++) olmadığı varsayılarak mükemmel bir şekilde atomiktir.

Atomik olarak, farklı nesneler aynı alana yazılan birçok iş parçacığının sonucu olarak bozuk nesneler okumayacağınız anlamına gelir. Java Concurrency In Practice 3.1.2

itibaren

Out-of-ince aire güvenliği: Bir iplik senkronizasyon olmadan bir değişken okuduğunda, bayat değerini görebilirsiniz, ama en azından bir değerini gördüğü aslında orada bazı rastgele değer yerine bir iplik tarafından yerleştirildi. Bu, değişken olmayan 64 bit uzun ve çift hariç tüm değişkenler için geçerlidir. JVM, 64-bit 'u okutmak veya atomik olmayan iki ayrı 32-bit işlem olarak yazmak için izinlidir. Uçucu

0

atomik

o