Поток может освободить свой монитор, используя lock.wait()
. Затем другой поток может взять монитор и войти в синхронизированный блок.
Пример:
public class MultipleThreadsInSynchronizedBlock {
public static void main(String... args) {
final Object lock = new Object();
Runnable runnable = new Runnable() {
public void run() {
synchronized (lock) {
System.out.println("Before wait");
try {
lock.wait();
} catch (InterruptedException e) {
}
System.out.println("After wait");
}
}
};
new Thread(runnable).start();
new Thread(runnable).start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
synchronized (lock) {
lock.notifyAll();
}
}
}
Это печатает:
Before wait
Before wait
After wait
After wait
Однако это не «взлом», чтобы позволить взаимоисключающему блоку быть запущенным неатомно. Если вы собираетесь использовать подобные низкоуровневые примитивы синхронизации, вам нужно знать, что вы делаете.