Java多线程里面join方法会使被阻塞线程释放对象锁吗?
问题描述如下:
public class HelloJava {
public static void main(String[] args) {
Object oo = new Object();
MyThread t1 = new MyThread("线程t1--", oo);
MyThread t2 = new MyThread("线程t2--", oo);
t2.start();
t1.start();
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class MyThread extends Thread{
private String name;
private Object oo;
public MyThread(String name,Object oo){
this.name = name;
this.oo = oo;
}
@Override
public void run() {
synchronized (oo) {
for(int i = 0; i < 1000; i++){
System.out.println(name + i);
}
}
}
}
锁对象是同一个,从结果来看t1线程调join方法后还是乖乖等着,因为没有拿到锁,那么join方法不会使被阻塞对象释放锁,可是从Thread类源码来看又是调了wait方法的,这是什么情况?求解答。
这是jdk源码:
oo
这把锁,从结果看,t2
线程先持有,t2
执行完才开始执行t1
,这个你应该明白。join
方法会造成当前线程wait
,就如你看到的这里的wait(0)
,是当前线程wait
,并不是调用者wait
,正如join
方法的说明一样,Waits for this thread to die. 你的程序里,就是说主线程等到t1
线程执行完以后再执行,主线程的wait
状态,应该是由t1
执行完成之后调用的notify
解除,这个是native
的,我只是猜测应该是这样。