0%

Java 并发编程学习

关于并发

并发在开发中广泛的应用,非常的重要,最近在读《Java并发编程的艺术》艺术,希望写一些东西来记录和巩固。

上下文切换、死锁

上下文切换

频繁的上下文切换不仅不能加快程序的运行,还会降低程序的性能。文中提到了一些方法减少上下文切换的方法:

  • 无锁并发编程
    通过将数据分段,使用不同线程处理不同的数据。
  • CAS 算法
    Java的Atomic包使用CAS算法来更新数据,而不需要加锁。
  • 使用最小线程
    避免创建不需要的线程,避免线程处于等待状态。
  • 使用协程
    在单线程里实现多任务的调度,并在线程里维持多个任务间的切换

死锁、避免死锁的常见方法

锁是一个非常有用的工具,但是出现死锁会导致系统不可用。
避免死锁的常见方法:

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

资源限制

带宽,内存,硬盘IO等硬件资源不足的时候,需要根据不同的资源调整程序并发大小。

Java并发底层相关实现

volatile 实现原则

  • Lock前缀指令会引起处理器缓存回写到内存。
  • 一个处理器的缓存回写到内存会导致其他处理器缓存无效。

synchronized的实现原理与应用