【阅读】Java并发编程的艺术-并发编程的挑战

74 阅读2分钟

上下文切换

什么是上下文切换

CPU通过给每个线程(任务)分配时间片实现多线程执行代码(多任务处理),当每个时间片结束、CPU切换到下一个任务前,需要保存当前任务的状态,切换到下一个任务时需要加载该任务的状态。

上下文切换带来的问题

进程/线程上下文切换会用掉你多少CPU?zhuanlan.zhihu.com/p/79772089

如何减少上下文切换

  • 无锁并发编程:如将数据进行hash取模后分段并发处理。
  • CAS算法:java的Atomic包使用CAS算法来更新数据,而不需要加锁。
  • 使用最少线程:避免创建不需要的线程。
  • 协程:在单线程中实现多任务调度,如quasar fiber、jdk19中的虚拟线程等。

死锁

什么是死锁

示例:

如何避免死锁

  • 避免一个线程获取多个锁。
  • 避免一个线程在锁区间内同时占用多个资源。
  • 使用定时锁,如java.util.concurrent.locks.Lock#tryLock(long, java.util.concurrent.TimeUnit)
  • 对于数据库锁,加锁和解锁必须在同一个数据库连接中。

资源限制

什么是资源限制

并发编程场景下,程序的执行速度受限于硬件或软件资源,如带宽限制、磁盘读写速度、CPU处理速度、数据库连接数、socket连接数等。

资源限制引发的问题

受限于资源,串行的代码改为并行执行并不能加快速度,反而因为增加了上下文切换、资源调度时间,变得更慢。

如何解决资源限制引发的问题

  • 硬件资源限制:如通过多机器执行程序,绕开单机资源限制。
  • 软件资源限制:如使用连接池复用数据库连接。

资源限制下如何进行并发编程

根据资源限制调整程序的并发度。