关于并发
并发在开发中广泛的应用,非常的重要,最近在读《Java并发编程的艺术》艺术,希望写一些东西来记录和巩固。
上下文切换、死锁
上下文切换
频繁的上下文切换不仅不能加快程序的运行,还会降低程序的性能。文中提到了一些方法减少上下文切换的方法:
- 无锁并发编程
通过将数据分段,使用不同线程处理不同的数据。 - CAS 算法
Java的Atomic包使用CAS算法来更新数据,而不需要加锁。 - 使用最小线程
避免创建不需要的线程,避免线程处于等待状态。 - 使用协程
在单线程里实现多任务的调度,并在线程里维持多个任务间的切换
死锁、避免死锁的常见方法
锁是一个非常有用的工具,但是出现死锁会导致系统不可用。
避免死锁的常见方法:
- 避免一个线程同时获取多个锁
- 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。
- 尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制。
- 对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。
资源限制
带宽,内存,硬盘IO等硬件资源不足的时候,需要根据不同的资源调整程序并发大小。
Java并发底层相关实现
volatile 实现原则
- Lock前缀指令会引起处理器缓存回写到内存。
- 一个处理器的缓存回写到内存会导致其他处理器缓存无效。