Eşzamanlılık sorunları hakkında birkaç yazı okuyorum ama hala bir şey hakkında emin değilim. Senkronize edildiğinde, bir uçbirimde kilit açılacağı zaman, sonraki iş parçacığının her zaman değiştirilen nesneyi okuduğundan, ücretsiz olarak uçucu işlevler aldığımı söyleyebilirim. Uçucu ile, bir nesnenin değeri hemen diğer konulara yansıtılır. Ama senkronize kullandığımda, nesne üzerindeki kilit nedeniyle onu hemen yansıtabilme olasılığı yoktur. Kilit serbest bırakıldığında, sadece başka bir iş parçacığı ona erişebilir. Yani değeri hemen diğer konulara yansıtmayı umursamıyorum. Bu hakkımı anlıyor muyum? her zaman 1 2 3 4 5 6 7 8 9 uçucu olmayanJava Senkronizasyon kullanıldığında, ücretsiz olarak volatil işlevlerim var mı?
[UPDATE]
Örnek yazdırılır.
package main;
public class Counter
{
public static long count = 0;
}
public class UseCounter implements Runnable
{
public void increment()
{
synchronized (this)
{
Counter.count++;
System.out.print(Counter.count + " ");
}
}
@Override
public void run()
{
increment();
increment();
increment();
}
}
public class DataRace
{
public static void main(String args[])
{
UseCounter c = new UseCounter();
Thread t1 = new Thread(c);
Thread t2 = new Thread(c);
Thread t3 = new Thread(c);
t1.start();
t2.start();
t3.start();
}
}
Güncelleştirmeniz hakkında: Şu anda ne yazıyor? bir şey ifade eder. Veri yarış koşulları genellikle en azından onları beklediğinizde gizlenir ve çoğaltılması ve çözülmesi çok zordur. Önemli olan, Java Bellek Modelinin kurallarını takip ettiyseniz. –
Ok teşekkürler. Her ne kadar uçsuz bucaksız davranışlar üretemesem de (kodu 1000.000 kez bir döngüde çalıştırdığımda bile değil) aklımda tutacağım. – Bevor