前言:之前在面试时候,让写一个实现死锁的代码,当时没有写出来,现在把实现的两种方式给记录一下。
方式一:
package com.fanxing;
/**
* @ClassName LambdaTest
* @Description TODO
* @Author LZX
* @Date 2021/5/26 9:51
* @Version 1.0
**/
public class LambdaTest {
public static void main(String[] args) {
new Thread(()->{
try {
System.out.println("thread1 is running");
synchronized (LambdaTest.class){
System.out.println("thread is block obj1");
Thread.sleep(2000);
synchronized (Object.class){
System.out.println("thread is block obj2");
}
}
} catch (Exception e){
e.printStackTrace();
}
}).start();
new Thread(()->{
try {
System.out.println("thread2 is running");
synchronized (Object.class){
System.out.println("thread is block obj123");
Thread.sleep(2000);
synchronized (LambdaTest.class){
System.out.println("thread is block obj234");
}
}
} catch (Exception e){
e.printStackTrace();
}
}).start();
}
}
方拾二:
public static void main(String[] args) {
Thread thread1=new Thread(new lock1());
Thread thread2=new Thread(new lock2());
thread1.start();
thread2.start();
}
/**
* @ClassName lock1
* @Description TODO
* @Author LZX
* @Date 2021/4/14 11:08
* @Version 1.0
**/
public class lock1 implements Runnable {
@Override
public void run() {
synchronized (lock1.class){
System.out.println("我获得了第一个锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2.class){
System.out.println("我获得了第二个锁");
}
}
}
}
/**
* @ClassName lock2
* @Description TODO
* @Author LZX
* @Date 2021/4/14 11:12
* @Version 1.0
**/
public class lock2 implements Runnable {
@Override
public void run() {
synchronized (lock2.class){
System.out.println("我获得了第二个锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock1.class){
System.out.println("我获得了第一个锁");
}
}
}
}