SORU
20 EYLÜL 2015, Pazar


= Operatör güvenli iplik-Java mı?

Aşağıdaki Java kodu buldum.

for (int type = 0; type < typeCount; type  )
    synchronized(result) {
        result[type]  = parts[type];
    }
}

result parts double[] nerede.

İlkel türler üzerinde temel işlemler, iş parçacığı için güvenli olduğunu biliyorum ama = konusunda emin değilim. Eğer synchronized yukarıdaki gerekli ise, belki de bu işlemi işlemek için daha iyi bir sınıf var mı?

CEVAP
20 EYLÜL 2015, Pazar


Hayır. = işlem iş parçacığı için güvenli değil. "Olur-önce" herhangi bir ifade için ilişkileri ortak bir alan veya dizi elemanı atama güvenli iplik-katılım. kilitleme ve / veya uygun bir zincir gerektirir

(Bir alan volatile, "olur-önce" ilişkileri var ... ama sadece ve yazma işlemleri. okuma olarak ilan etti = bir okuma işlemi oluşur ve yazma. Bu tek tek atom vardır, ama sırası değil. Ve en çok atama ifadeleri = kullanarak bir veya daha fazla hem okur dahil (sağ tarafta) ve yazma. Busıraatom ya da değil.)

Tam hikaye için okumak 17.4 ... ya da "" Brian Goetz ve ark. Action Java Eşzamanlılık ilgili bölüm İDEA

İlkel türler üzerinde temel işlemler, iş parçacığı için güvenli olduğunu biliyorum

Aslında, bu yanlış bir önerme

  • diziler gözönüne alalım
  • ifadeler genellikle operasyonların bir dizi oluşur ve atomik işlemler dizisi atom garantisi olmadığını düşünün.

double türü için ek bir sorun vardır. Bu İDEA (17.7) şöyle diyor:

"Java programlama dili hafıza modeli amacıyla, geçici olmayan uzun ya da çift değeri için tek bir yazma iki ayrı yazar olarak kabul edilir: her bir 32-bit yarısı. Bu bir iş parçacığı bir yaz 64-bit bir değeri ilk 32 bit görür durumda neden olabilir, ve başka bir ikinci 32 bit yaz."

"Uzun ve çift değişken değerleri yazar okur her zaman atom vardır."


Bir yorum, sordu:

Yazın ben bu döngünün tüm konuları durduran küresel senkronizasyon, önlemek için ne yapmalıyım?

Bu durumda (**12, orada güncelliyoruz kilitler ya da ilkel uyumu ile senkronizasyon için başka alternatif.

int[] AtomicIntegerArray AtomicLongArray ile değiştirin ve bu sınıfların işine yarar long[] a'-kilit ücretsiz güncelleme. Ancak AtomicDoubleArray sınıf, hatta AtomicDouble bir sınıf yoktur.

(GÜNCELLEME- birisi Guava AtomicDoubleArray bir sınıf, böylece sağlar dikkat çektibir seçenek olabilir. İyiydi aslında.)

Kaçınmanın bir yolu, bir "küresel lock" ve büyük çekişme sorunlarına kavramsal bölgelere dizi bölmek için olabilir, her biri kendi kilidi ile. Bu şekilde, bir iş parçacığı, yalnızca dizinin aynı bölgede kullanıyorsanız, başka bir iş parçacığı engellemek gerekiyor. (Tek yazar / çoklu okuyucu kilitler erişir büyük çoğunluğu okur, çok yardımcı ... olabilir.)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Angry Paintballer

    Angry Paintb

    8 Ocak 2012
  • SuppressedStorm

    SuppressedSt

    11 AĞUSTOS 2013
  • ThreadBanger

    ThreadBanger

    2 Mart 2007