java会释放所有锁吗?
我编写这个程序是为了检查在两个不同对象上持有锁的线程:LOCK_OBJECT
和FULL
是否在LOCK_OBJECT
上使用FULL.wait()
进入等待模式。我没想到消费者会得到LOCK_OBJECT
锁,但印刷品没有。那么你错过了什么吗
为什么消费者会根据打印的结果获得LOCK_OBJECT
锁
这是我的代码:
public class TestSync {
private volatile Integer amount = 0;
private final Object LOCK_OBJECT = new Object();
private final Object FULL = new Object();
public void doubleSync() throws InterruptedException {
System.out.println("Producer trying to get LOCK_OBJECT lock ");
synchronized (LOCK_OBJECT) {
System.out.println("Producer get LOCK_OBJECT lock ");
Print.sleep(3000);
while (amount >= 0) {
synchronized (FULL) {
System.out.println("full!");
FULL.wait();
}
}
System.out.println("continue~");
amount++;
}
}
public void simpleSync() {
System.out.println("Consumer trying to get LOCK_OBJECT lock ");
synchronized (LOCK_OBJECT) {
System.out.println("Consumer get LOCK_OBJECT lock");
}
System.out.println("Consumer release LOCK_OBJECT lock");
}
public static void main(String[] args) throws InterruptedException {
AtomicInteger atomicInteger = new AtomicInteger(0);
ExecutorService threadPool = Executors.newFixedThreadPool(1, new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
int index = atomicInteger.incrementAndGet();
System.out.println("create no " + index + " thread");
Thread t = new Thread(r, "one Thread-" + index);
return t;
}
});
threadPool.execute(() -> {
try {
new TestSync().doubleSync();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
Print.sleep(1000);
ExecutorService executorService = Executors.newFixedThreadPool(1, new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
int index = atomicInteger.incrementAndGet();
System.out.println("create no " + index + " thread");
Thread t = new Thread(r, "two Thread-" + index);
return t;
}
});
executorService.execute(() -> {
try {
new TestSync().simpleSync();
} catch (Exception e) {
e.printStackTrace();
}
});
}
}
这是打印结果:
create no 1 thread
sleep 1000
Producer trying to get LOCK_OBJECT lock
Producer get LOCK_OBJECT lock
sleep 3000
create no 2 thread
Consumer trying to get LOCK_OBJECT lock
Consumer get LOCK_OBJECT lock
Consumer release LOCK_OBJECT lock
full!
# 1 楼答案
一,。继续执行一个ExecutorService实现总是更好的(因为出于性能原因,我们始终保持有限数量的活动线程)
二,。wait()确实会释放单个对象的锁,但在这之后,所有线程(考虑到相同的优先级)都有可能获得锁