如果从同步块返回,锁何时被释放?

时间:2017-01-14 19:41:30

标签: java multithreading locking

如果我有来自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 - 释放锁

1 个答案:

答案 0 :(得分:4)

synchronized语句在Java Language Specification中指定。

SynchronizedStatement:  
    synchronized ( Expression ) Block 
     
      
  • [..]
  •   
  • 否则,让Expression的非空值为V。执行线程锁定与V关联的监视器。那么Block   执行,然后有一个选择:      
        
    • 如果Block的执行正常完成,则监视器将解锁并且synchronized语句正常完成。
    •   
    • 如果Block的执行因任何原因突然完成,则监控器将解锁,synchronized语句completes abruptlyreturn突然完成)同样的原因。
    •   
  •   

换句话说,锁定只保留synchronized语句正文的长度。

System.out.println("Static Block : Thread " + Thread.currentThread().getName() + " -- have the lock");
Thread.currentThread().sleep(1000);
return 0;

finally块将在不保持锁定的情况下执行。

在持有锁的同时,执行线程会将评估return语句的结果推送到堆栈,释放锁,执行finally块,然后返回价值。