1、死锁
出现场景:当线程A拥有了A对象的锁,想要去获取B对象的锁;线程B拥有了B对象的锁,想要拥有A对象的锁,两个线程在获取本文来源[email protected]搞@^&代*@码网(锁的时候,都不会释放已经持有的锁,于是,就造成了死锁。
示例代码:
@Slf4j public class ThreadTest { private static Object objectA = new Object(); private static Object objectB = new Object(); public static void main(String[] args) throws InterruptedException { Thread t2 = new Thread(()->{ synchronized (objectA){ log.debug("线程t2获取到了objectA"); synchronized (objectB){ log.debug("线程t2获取到了objectB"); } } },"t2"); Thread t1 = new Thread(()->{ synchronized (objectB){ log.debug("线程t1获取到了objectB"); synchronized (objectA){ log.debug("线程t1获取到了objectA"); } } },"t1"); t2.start(); t1.start(); } }
如何检测死锁:
两种方法
(1)找到本机jconsole程序,直接在windows系统搜索就可以,打开是这个样子。
然后在本地进程里面选择你的进程,其实就是你的项目名称。然后点击连接,在点击不安全连接。
再点击检测死锁
2、死锁经典问题――哲学家就餐问题
经典场景:有四位哲学及在一正方形的桌子上面吃饭,桌子的每个角有一根筷子,一共四根,那么,当每个哲学家都拿起自己左边的筷子之后,再去拿自己右边的筷子的时候,就会发现自己右边没有筷子,这时哲学就就会等右边的哲学家放下筷子,但是每个哲学家都是这个想法,那么都不会放下筷子,并且都拿不到右边的筷子,因此就造成了死锁。