目录
死锁 DeadLock
前提:一个线程完成业务需要同时访问两个资源。
死锁:多个线程同时在完成业务,出现争抢资源的情况。
资源类
public class DeadLockRunnable implements Runnable {
//编号
public int num;
//资源
private static Chopsticks chopsticks1 = new Chopsticks();
private static Chopsticks chopsticks2 = new Chopsticks();
/**
* num = 1 拿到 chopsticks1,等待 chopsticks2
* num = 2 拿到 chopsticks2,等待 chopsticks1
*/
@Override
public void run() {
// TODO Auto-generated method stub
if(num == 1) {
System.out.println(Thread.currentThread().getName()+"拿到了chopsticks1,等待获取chopsticks2");
synchronized (chopsticks1) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (chopsticks2) {
System.out.println(Thread.currentThread().getName()+"用餐完毕!");
}
}
}
if(num == 2) {
System.out.println(Thread.currentThread().getName()+"拿到了chopsticks2,等待获取chopsticks1");
synchronized (chopsticks2) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (chopsticks1) {
System.out.println(Thread.currentThread().getName()+"用餐完毕!");
}
}
}
}
}
public class DeadLockTest {
public static void main(String[] args) {
DeadLockRunnable deadLockRunnable1 = new DeadLockRunnable();
deadLockRunnable1.num = 1;
DeadLockRunnable deadLockRunnable2 = new DeadLockRunnable();
deadLockRunnable2.num = 2;
new Thread(deadLockRunnable1,"张三").start();
new Thread(deadLockRunnable2,"李四").start();
}
}
如何破解死锁
不要让多线程并发访问
public class DeadLockTest {
public static void main(String[] args) {
DeadLockRunnable deadLockRunnable1 = new DeadLockRunnable();
deadLockRunnable1.num = 1;
DeadLockRunnable deadLockRunnable2 = new DeadLockRunnable();
deadLockRunnable2.num = 2;
new Thread(deadLockRunnable1,"张三").start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new Thread(deadLockRunnable2,"李四").start();
}
}
使用 lambda 表达式简化代码开发
public class Test3 {
public static void main(String[] args) {
//lambda表达式
new Thread(()->{
for(int i=0;i<100;i++) {
System.out.println("+++++++++++Runnable");
}
}) .start();
}
}
public class Test3 {
public static void main(String[] args) {
new Thread(()->{for(int i=0;i<100;i++) System.out.println("+++++++Runnable");}).start();
new Thread(()->{for(int i=0;i<100;i++) System.out.println("----Runnable");}).start();
new Thread(()->{for(int i=0;i<100;i++) System.out.println("++++=====++Runnable");}).start();
}
}