= 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
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.)
Java Daemon iplik nedir...
:: (double kolon) Java 8'de operatör...
Neden't Java operatör yükleme sun...
Oluşturma "mantıksal özel veya&qu...
Java'da üçlü operatör sadece 7 - Java ...