İd = 1 - atom numarası nedir?
OCP, sayfa 291 6 Programcı Java SE Uygulama Sınavları, soru 25:
public class Stone implements Runnable {
static int id = 1;
public void run() {
id = 1 - id;
if (id == 0)
pick();
else
release();
}
private static synchronized void pick() {
System.out.print("P ");
System.out.print("Q ");
}
private synchronized void release() {
System.out.print("R ");
System.out.print("S ");
}
public static void main(String[] args) {
Stone st = new Stone();
new Thread(st).start();
new Thread(st).start();
}
}
Cevapları biridir:
Çıkışı
P Q P Q
olabilir
Doğru cevap olarak işaretledim. Benim akıl:
- İki iş parçacığı başlıyoruz.
- İlk
run()
girer. - JLS 15.26.1, birincisi göre değerlendirir
1 - id
. Sonuç0
. İş parçacığı yığınının üzerinde depolanan. Sadece0
kaydetmek üzere statikid
, ama... - Patlama, zamanlayıcı çalıştırmak için ikinci iş parçacığının seçer.
- Yani, ikinci iş parçacığı
run()
girer. Statikid
pick()
yöntem o yürütür yani 10**.P Q
yazdırılır. - Zamanlayıcı çalıştırmak için ilk iplik seçer. Yığından
0
alır ve statik kaydederid
. Yani, ilk iş parçacığı dapick()
yürütür veP Q
yazdırır.
Ancak, kitapta bu cevap yanlış olduğunu yazıyor:
Hattı
0
1
arasıid = 1 - id
değiştiririd
değeri nedeniyle yanlıştır. Aynı yöntemi iki kez idam edilmesi için bir şans var.
Ben aynı fikirde değilim. Senaryo, ben yukarıda sunulan için bir şans olduğunu düşünüyorum. Böyle bir takas atomik değil. Yanılıyor muyum?
CEVAP
Yanılıyor muyum?
Hayır, örnek zaman çizelgesi olarak kesinlikle haklısınız.
Ek olarak bu değil atom, değil Garanti Bu yazmak için id
olacak aldı diğer iplik neyse, verilen bu yok senkronizasyon ve alan değil uçucu.
Bu yanlış olduğu gibi referans malzeme için biraz sinir bozucu oluyor :(
161803398 A 'Özel' Numarası ...
Atom / farkı / senkronize Değişken ned...
ıntel android sdk manager 86 atom sist...
Yüce metin ve Github arasındaki fark&#...
Sağa ve yukarıdan aşağıya, soldan 2 bo...