1、互斥条件
2、请求和保持条件
3、不剥夺条件
4、环路等待条件
package com.current.flame.deadLock; import lombok.extern.slf4j.Slf4j; /** * @author haoxiansheng * 死锁发生 * 简单的死锁 */ @Slf4j public class DeadLock implements Runnable { private int flag = 1; // 静态对象是类的所有对象共享的 private static Object o1 = new Object(), o2 = new Object(); @Override public void run() { log.info("flag=>{}", flag); if (flag == 1) { synchronized (o1) { try { Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } synchronized (o2) { log.info("o2=>"); } } } if (flag == 0) { synchronized (o2) { try { Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } synchronized (o1) { log.info("o1=>"); } } } } public static void main(String[] args) { DeadLock deadLock1 = new DeadLock(); DeadLock deadLock2 = new DeadLock(); // deadLock1.flag = 1; deadLock2.flag = 0; new Thread(deadLock1).start(); new Thread(deadLock2).start(); } }1、加锁顺序、超时解锁、死锁检测()、设置线程优先级 从这几方面考虑。
2、安达迩定律
1、使用本地变量
2、使用不可变类
3、最小化锁的作用域范围:S=1/(1-a+a/n)
4、使用线程池的Executor,而不是直接new Thread执行
5、宁可使用同步也不要使用线程的wait 和notify
6、使用BlockingQueue实现生产-消费模式
7、使用并发集合而不是加锁的同步集合
8、使用Semaphore 创建有界的访问
9、宁可使用同步代码块,也不使用同步的方法
10、避免使用静态变量