【高并发】15 死锁、多线程并发最佳实战

    技术2024-10-26  22

    一、死锁的必要条件

    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、避免使用静态变量

    Processed: 0.010, SQL: 9