Więc mam kodu podobnego do tegoJak zdobyć wiele zamków bez ograniczania zamówień w Javie?
synchronized(objectOne){ do stuff }
synchronized(objectTwo){ do stuff }
Problem polega na tym, program będzie czekać na zamek na , nawet jeśli blokada objectTwo
jest dostępna. Próbuję to powiedzieć: spróbuj zablokować zarówno , jak i objectTwo
i niezależnie od tego, którą blokadę otrzymasz, najpierw wykonaj te czynności dla tej blokady. Wymyśliłem rozwiązanie, ale myślę, że jest raczej hacky i zastanawiam się, czy ktoś ma lepsze pomysły.
Oto mój pomysł: Rozpocznij 2 wątki, każdy czeka na blokadę, a główny wątek będzie czekał na CountDownLatch. Więc skończyć z czymś takim:
CountDownLatch latch = new CountDownLatch(2);
new Thread(new Runnable(){
public void run(){
synchronized(objectOne) { do stuff }
latch.countDown();
}).start();
new Thread(new Runnable(){
public void run(){
synchronized(objectTwo) { do stuff }
latch.countDown();
}).start();
latch.await();
To brzmi jak rozsądne podejście do mnie. – ArtB
Nie mogę powiedzieć o opublikowanym kodzie, ale z mojego doświadczenia wynika, że klasa, która blokuje dwa różne obiekty powinna prawie zawsze być podzielona na dwie klasy, z blokadą zamkniętą ** wewnątrz ** dwie klasy, a nie klasą, która agreguje one – Nate
używasz dwóch różnych blokad, więc wątek B może nie widzieć zmiany pamięci przez wątek A, podejrzewam, że nie będzie żadnego zdarzenia - przedtem tutaj. –