join()方法是否会释放锁?
众所周知,join()方法底层调用了wait()方法,那么wait()方法明明是会释放锁的,为什么会有join是否释放锁的这个问题出现呢?原因是因为join()方法只会释放内部锁(自己方便的叫法),不会释放外部锁(自己方便的叫法)。
废话不多说,上代码
public synchronized void test(Object obj){
//join不释放锁 可能引起死锁
thread.join();
}
public synchronized void test(Thread thread){
//join释放锁 ,正常执行
thread.join();
}
//解析如下
public synchronized void test(Object obj){
//join不释放锁,指的不会释放obj的锁,但是释放了thread的对象锁
//也就是相当于一个可重入锁
thread.join();
//上面的代码相当于
synchronized(Thread thread){
thread.wait();
}
//然后wait释放时,释放了thread的对象锁,不会释放Obj的锁
}
总结
join只会释放内部锁,不会释放外部锁。