java程会释放锁join_Java多线程里面join方法会使被阻塞线程释放对象锁吗?

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);

}

}

}

}

f4f0259da18ff7ebcaf67e6b4df51489.png

锁对象是同一个,从结果来看t1线程调join方法后还是乖乖等着,因为没有拿到锁,那么join方法不会使被阻塞对象释放锁,可是从Thread类源码来看又是调了wait方法的,这是什么情况?求解答。

这是jdk源码:

c0b50822b882cf1b2b8842732747a4bc.png

oo

这把锁,从结果看,

t2

线程先持有,

t2

执行完才开始执行

t1

,这个你应该明白。

join

方法会造成当前线程

wait

,就如你看到的这里的

wait(0)

,是当前线程

wait

,并不是调用者

wait

,正如

join

方法的说明一样,Waits for this thread to die. 你的程序里,就是说主线程等到

t1

线程执行完以后再执行,主线程的

wait

状态,应该是由

t1

执行完成之后调用的

notify

解除,这个是

native

的,我只是猜测应该是这样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值