Witam
Staram się ogarnąć coś ze współbieżności javy i tworzę różne mało użyteczne przykłady w celach dydaktycznych. Mam takie pytanie do przykładu który zamieściłem poniżej: Dlaczego Thread viewer nie wywołuje się w wątku t4 który ma założony lock? Wcześniej na wszelki wypadek zdejmuje ten lock ale i tak nie pomaga.Komunikaty na konsoli nie wskazują aby inny wątek niż viewer przejmował wtedy blokadę. W programie jeden wątek inkrementuje zmienną a drugi ją dekrementuje.
`
public class WspoldzielenieZasobow {
static volatile int d = 0;
static volatile boolean flag = false;
public static void main(String[] args) {
final Lock lock = new ReentrantLock();
Thread viewer = new Thread() {
@Override public void run() {
while(true) {
System.out.println(d);
try {
Thread.sleep(1000);
}
catch(InterruptedException e) {
System.out.println(e);
}
}
}
};
Thread t3 = new Thread() {
@Override public void run() {
boolean isLock = false;
while(true) {
if( !flag && (isLock = lock.tryLock())) {
try {
System.out.println("Wywolanie t3");
d++;
flag = true;
}
finally {
if(isLock)
lock.unlock();
Thread.yield();
}
}
}
}
};
Thread t4 = new Thread() {
@Override public void run() {
boolean isLock = false;
while(true) {
if( flag && (isLock = lock.tryLock())) {
try {
System.out.println("Dekrementacja t4: " + (--d));
flag = false;
try {
System.out.println("Proboa wywolania viewer.join()");
lock.unlock();
viewer.join();
lock.lock();
Thread.sleep(1000);
}
catch(InterruptedException e) {
System.out.println(e);
}
}
finally {
if(isLock)
lock.unlock();
Thread.yield();
}
}
}
}
};
t3.start();
t4.start();
}
}
`