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

查看:524
本文介绍了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);
            }
        }
    }
}

锁对象是同一个,从结果来看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的,我只是猜测应该是这样。

这篇关于Java多线程里面join方法会使被阻塞线程释放对象锁吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆