想弄清楚 join 是否会释放锁
实验思路:
在主线程设置对象锁,将锁对象传给 Thread1 ,Thread1针对锁对象进行同步
代码:
/**
* @author ST_JG
* @version 1.0
*/
public class JoinLock_ {
public static void main(String[] args) {
Object obj = new Object();
Thread2 t2 = new Thread2();
Thread1 test1 = new Thread1();
Thread1 t1 = new Thread1(t2,obj,test1);
t1.start();
synchronized (obj){
for(int i = 0; i < 10; i++){
if(i == 5){
try {
System.out.println("运行join");
t1.join();
System.out.println("结束join");
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
System.out.println("hello" + i);
}
}
}
}
class Thread1 extends Thread{
private Object obj;
private Thread2 t2;
private Thread1 text1;
public Thread1(Thread2 t2,Object obj,Thread1 text1){
this.obj = obj;
this.t2 = t2;
this.text1 = text1;
}
public Thread1(){
}
@Override
public void run() {
synchronized (obj){
for (int i = 0; i < 10; i++) {
System.out.println("Thread1,我解封了");
}
}
}
}
class Thread2 extends Thread{
}
第一种情况:锁对象为 Object 类(其他不继承 Thread的类)
实验结果,会发生死锁,说明将其他不继承 Thread的类作为锁对象,join不能释放他的锁
第二种情况:锁对象为 Thread2 类(继承Thread的类)
实验结果:也会发生死锁,说明其他 继承Thread的其他类,join也不能释放他的锁
第三种情况:锁对象为 调用join的对象,但不是他本身
实验结果:也会发生死锁
第四种情况:锁对象为 调用join对象本身
实验结果:死锁不发生,说明 调用join释放了以本身为锁对象的锁
总结:join 可以释放锁,但也仅限于上锁对象为调用join的对象时才会解锁
本人是个刚学到多线程的萌新,路过的大佬帮忙看看是否错误,感谢