如果我有来自synchronized块的return语句,我对释放锁的点感到困惑;为了找到这一点,我添加了try-finally块并在最后一个块打印中添加了一个sysout' lock release'但是我甚至可以在那之前发现'语句打印,第二个线程已经获得锁定。什么时候锁被释放?事情变得更加混乱的保证是什么?
public static int testClassLevelMonitor() throws InterruptedException {
try {
synchronized(TestLocks.class) {
System.out.println("Static Block : Thread " + Thread.currentThread().getName() + " -- have the lock");
Thread.currentThread().sleep(1000);
return 0;
}
} finally {
System.out.println("Static Block : Thread " + Thread.currentThread().getName() + " -- released the lock");
System.out.println("\n\n");
}
}
静态阻止:线程池-1-线程-1 - 具有锁
静态阻止:线程池-1-线程-2 - 具有锁
静态阻止:线程池-1-线程-1 - 释放锁
静态阻止:线程池-1-线程-2 - 释放锁
答案 0 :(得分:4)
synchronized
语句在Java Language Specification中指定。
SynchronizedStatement: synchronized ( Expression ) Block
- [..]
- 否则,让
Expression
的非空值为V
。执行线程锁定与V
关联的监视器。那么Block
执行,然后有一个选择:
- 如果
Block
的执行正常完成,则监视器将解锁并且synchronized
语句正常完成。- 如果
Block
的执行因任何原因突然完成,则监控器将解锁,synchronized
语句completes abruptly(return
突然完成)同样的原因。
换句话说,锁定只保留synchronized
语句正文的长度。
System.out.println("Static Block : Thread " + Thread.currentThread().getName() + " -- have the lock");
Thread.currentThread().sleep(1000);
return 0;
finally
块将在不保持锁定的情况下执行。
在持有锁的同时,执行线程会将评估return
语句的结果推送到堆栈,释放锁,执行finally
块,然后返回价值。