public class MyStack2 {
private int[] values = new int[10];
private int index = 0;
public synchronized void push(int x) {
if (index <= 9) {
values[index] = x;
Thread.yield();
index++;
}
}
public synchronized int pop() {
if (index > 0) {
index--;
return values[index];
} else {
return -1;
}
}
public synchronized String toString() {
String reply = "";
for (int i = 0; i < values.length; i++) {
reply += values[i] + " ";
}
return reply;
}
}
public class Pusher extends Thread {
private MyStack2 stack;
public Pusher(MyStack2 stack) {
this.stack = stack;
}
public void run() {
for (int i = 1; i <= 5; i++) {
stack.push(i);
}
}
}
public class Test {
public static void main(String args[]) {
MyStack2 stack = new MyStack2();
Pusher one = new Pusher(stack);
Pusher two = new Pusher(stack);
one.start();
two.start();
try {
one.join();
two.join();
} catch (InterruptedException e) {
}
System.out.println(stack.toString());
}
}
Od metod MyStack2
klasy są zsynchronizowane, spodziewałem wyjście jako 1 2 3 4 5 1 2 3 4 5. Ale wyjście nieokreślony. Często daje: 1 1 2 2 3 3 4 4 5 5synchronization- Temat Kiedy nitki zwolnić blokadę na obiekcie
Zgodnie z moim rozumieniem, po uruchomieniu wątku jeden nabywa on blokadę metody push
. Wewnątrz push()
wątek jeden daje na jakiś czas. Ale czy zwalnia blokadę po wywołaniu yield()
? Teraz, gdy wątek drugi zostanie uruchomiony, czy wątek dwóch uzyska blokadę, zanim wątek jeden zakończy wykonywanie? Czy ktoś może wyjaśnić, kiedy wątek jeden zwalnia blokada obiektu na stosie?
Spójrz na ten http://stackoverflow.com/questions/18635616/yield-inside-synchronized-block-lock-release-after-calling-yield – SimY4