JAVA并发1:并发编程的挑战

上下文切换

一个CPU同一时刻只能执行一个线程;CPU 经过给每一个线程分配必定的时间片,时间片很是短,一般是几十毫秒,来不停的切换线程执行任务,达到了多线程的效果。当线程用完本身的时间片后,及时任务尚未完成,操做系统也会剥夺它的执行权,让另外一条线程执行。算法

当一条线程的时间片用完后,操做系统会暂停该线程,并保存该线程相应的信息(到程序计数器),而后再随机选择一条新线程去执行,这个过程称为“上下文切换”。因为进行上下文切换时,须要保存当前线程的状态,并加载线程先前的状态,这是有消耗的,所以应该尽可能减小上下文切换的次数。数据库

减小上下文切换

  • 减小线程的数量,避免建立没必要要的线程。
  • 采用无锁并发编程。采用一些办法避免使用锁,如将数据ID按照 Hash(id) 进行取模分段,每一个线程处理各自分段的数据,避免使用锁。
  • 采用 CAS 算法。 Java 的 Atomic 包使用 CAS 算法更新数据,不须要加锁。
  • 协程。在单线程里实现多任务调度,并在单线程里维持多个任务间的切换。

死锁

当一个线程永远地持有一个锁,而且其余线程都尝试得到这个锁,那么它们将被永远阻塞。在线程A持有锁L1并想得到锁L2的同时,线程B持有锁L2并想得到L1,那么这两个线程将永远等待下去,也就是产生了死锁。编程

避免死锁的几个常见方法:多线程

  • 避免一个线程同时获取多个锁
  • 避免一个线程在锁内同时占用多个计算机资源,尽可能保证一个锁只占用一个资源。
  • 尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制。
  • 对于数据库锁,加锁和解锁都要保证必须在一个数据库链接里,不然会出现解锁失败的状况。

资源限制

资源限制是指在进行并发编程时,程序的执行速度受限于计算机的硬件资源或者软件资源,这些计算机资源限制了程序的并发度。并发

线程多了致使线程的上下文切换增多,资源有限,会产生损耗。操作系统

解决资源限制的方法:.net

  • 对于硬件资源限制,考虑使用集群并行程序。
  • 对于软件资源限制,能够考虑使用资源池对资源进行复用,如线程池和数据库链接池。

参考资料

相关文章
相关标签/搜索