JVM15-经典面试题之死锁-经典面试题之线程状态

线程死锁是什么?怎么模拟一个线程死锁?怎么用jstack定位到线程死锁
- 线程死锁是什么?

  * 线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行
- 死锁的模拟过程,代码模拟死锁

public class CPULockTest {

    private static Object lock1 = new Object();
    private static Object lock2 = new Object();

    public static void main(String[] args) {
        new Thread(()->{
            synchronized (lock1){
                try {
                    System.out.println(Thread.currentThread().getName()+"得到lock1");
                    Thread.sleep(3000L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock2){
                    System.out.println(Thread.currentThread().getName()+"得到lock2");
                }
            }
        },"线程1").start();

        new Thread(()->{
            synchronized (lock2){
                try {
                    System.out.println(Thread.currentThread().getName()+"得到lock2");
                    Thread.sleep(3000L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock1){
                    System.out.println(Thread.currentThread().getName()+"得到lock1");
                }
            }
        },"线程2").start();
    }
}

-怎么用jstack定位到线程死锁

 

线程状态有哪些?他们之间是怎么切换的

- 线程状态分类

  - NEW
  - RUNNABLE
  - BLOCKED 一个正在阻塞等待一个监视器的线程

  如上例子就是blocked状态

  - WAITING 一个正在无限期等待另一个线程执行一个特别的动作的线程
  - TIMED_WAITING 一个正在限时等待另一个线程执行一个动作的线程
  - TERMINATED  线程结束

 

* Blocked状态与Waiting状态的区别

  * WAITING 状态属于主动地显式地申请的阻塞,BLOCKED 则属于被动的阻塞

 

posted @ 2019-08-02 11:45  valar-dohaeris  阅读(465)  评论(0)    收藏  举报