java死锁Demo和死锁检测

    科技2024-03-28  89

    import java.util.concurrent.TimeUnit; /** * @author Jing * @date 2020/10/6 0006 17:37 */ public class DieLockDemo { public static void main(String[] args) { String a = "a"; String b = "b"; Source2 source2 = new Source2(a, b); Source2 source21 = new Source2(b, a); // new Thread(new Runnable() { // @Override // public void run() { // try { // source2.run(); // } catch (InterruptedException e) { // e.printStackTrace(); // } // } // }).start(); // new Thread(new Runnable() { // @Override // public void run() { // try { // source21.run(); // } catch (InterruptedException e) { // e.printStackTrace(); // } // } // }).start(); new Thread(new Source1(a,b)).start(); new Thread(new Source1(b,a)).start(); } } class Source1 implements Runnable{ String LockA; String LockB; public Source1(String lockA, String lockB) { LockA = lockA; LockB = lockB; } public void run(){ synchronized (LockA){ System.out.println("我拿到了"+LockA); synchronized (LockB){ System.out.println("我想要"+LockB); } } } } class Source2 { String LockA; String LockB; public Source2(String lockA, String lockB) { LockA = lockA; LockB = lockB; } public void run() throws InterruptedException { synchronized (LockA){ System.out.println("我拿到了"+LockA); TimeUnit.SECONDS.sleep(1); synchronized (LockB){ System.out.println("我想要"+LockB); } } } }

    死锁检测: 通过jsp-l命令找到后台的java进程,这里并不能看出哪个是死锁的进程,需要记住每一个或者你认为有死锁的进程的编号。 jstack+进程编号 然后会发现有一个deadlock就说明这有个死锁。

    Processed: 0.012, SQL: 8