为什么第二次打印t2的状态会输出TIMED_WAITING ?不应该还是BLOCKED吗,t1还没释放锁啊?

来源:6-5 阻塞的含义

慕容9054781

2020-01-29

public class BlockedWaitingTimeWaiting implements Runnable {

public static void main(String[] args) throws InterruptedException {
    BlockedWaitingTimeWaiting runnable = new BlockedWaitingTimeWaiting();
    Thread t1 = new Thread(runnable);
    t1.start();
    Thread t2 = new Thread(runnable);
    t2.start();
    Thread.sleep(5);
    System.out.println(t1.getState());  //TIMED_WAITING : t1正在 Thread.sleep(1000)
    System.out.println(t2.getState());  //t2正在  syn() 阻塞,拿不到t1正持有的锁
    Thread.sleep(1300);
    System.out.println(t1.getState());  //WAITING
    System.out.println(t2.getState());  //这里输出的是TIMED_WAITING???
}

@Override
public void run() {
    syn();
}

private synchronized void syn() {
    try {
        Thread.sleep(1000);
        wait();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

}

写回答

2回答

悟空

2020-01-30

是的,其他同学已经回答了

1
2
悟空
回复
MarcoLiLiLi
t1正在执行的wait()方法会释放锁资源,从而t2可以拿到锁,正在sleep,所以是TIMED_WAITING
2020-03-30
共2条回复

慕粉6188528

2020-01-30

都是执行wait();,后面两个都应该为waiting状态

0
0

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程