并发编程的目的是为了让程序运行的更快。但是会面临很多挑战:上下文切换、死锁、硬件和软件资源限制。

上下文切换。

工具

  • 使用Lmbench3可测量上下文切换的时长。
  • 使用vmstat可以测量上下文切换的次数。

    如何减少上下文切换

  • 无锁并发编程

  • CAS算法
  • 使用最少线程
  • 协程

    死锁

    ```java private static String lockA = “A”; private static String lockB = “B”;

public static void main(String[] args) { new DeadLockDemo().deadLock(); }

public void deadLock() { Thread threadA = new Thread(()->{ synchronized (lockA){ try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lockB){ System.out.println(1); } } }); Thread threadB = new Thread(()->{ synchronized (lockB){ synchronized (lockA){ System.out.println(2); } } }); threadA.start(); threadB.start(); } ```

  • 避免一个线程同时获取多个锁
  • 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源
  • 尝试使用定时锁,使用lock.tryLock(timeout)来代替使用内部锁机制。
  • 对数据库锁,加锁和解锁必须在一个数据库连接里。否则会出现解锁失败的情况

    资源限制

  • 硬件资源限制:带宽限制的上传/下载。硬盘读写速度和cpu处理速度

  • 软件资源限制:数据库连接数和socket连接数。