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
的,我只是猜测应该是这样。