Java并发编程的艺术-第一章之并发编程的挑战

Java 的另一个经典书籍之一《Java 并发编程的艺术》你们确定也是看过的,今天开始我按照个人理解通俗的讲解这本书。算法

首先并发编程的目的就是让程序跑的更快,可是并非开启更多的线程就能让程序就能最大限度的并发执行,在实际的并发编程中,还会面临这不少的挑战,例如:上下文切换、死锁问题、硬件、软件的资源受限所带来的问题。数据库

一、1 上下文切换编程

CPU经过给每一个线程分配CPU时间片来执行多个线程,时间片通常很是的短,CPU经过不断的切换线程执行,因此让咱们感受多个线程是并发同时进行的,可是实际上并非的。当前的任务执行了一个时间片后,保存当前的状态以便下一次再加载这个任务的状态,而后切换当下一个任务。因此任务从保存到再加载的过程就是一次上下文切换。然而上下文切换是须要时间的,会影响多线程的执行效率。多线程

如何减小上下文切换并发

一、无锁并发编程。多线程竞争锁时,会引发上下文切换,没有竞争到锁的线程,一直处于等待状态,因此上下文切换的时间会比较长。因此可使用一些方法避免使用锁。例如数据的ID利用Hash算法取模,不一样的线程取不一样的数据段。工具

二、CAS 算法。Java 的Atomic包就是使用的CAS算法更新数据,而不加锁。性能

三、使用最少线程。避免建立没必要要的线程。.net

四、协程。协程看上去也是子程序,但执行过程当中,在子程序内部可中断,而后转而执行别的子程序,在适当的时候再返回来接着执行。最大的优点就是协程极高的执行效率。由于子程序切换不是线程切换,而是由程序自身控制,所以,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优点就越明显。第二大优点就是不须要多线程的锁机制,由于只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只须要判断状态就行了,因此执行效率比多线程高不少。线程

 

一、2 死锁协程

在并发编程中很容易出现死锁,一旦出现死锁,系统功能就不能使用,书中介绍几种常见避免死锁的方式。

一、避免一个线程同时得到多个锁

二、保证一个锁只占用一个资源

三、尝试使用定时锁

四、数据裤锁,加锁和解锁i必须在同一个数据库链接中

 

一、3 资源限制的挑战

硬件资源的限制:能够用集群执行程序

软件资源的限制:使用链接池资源的复用

 

总结:

并发编程写的不严谨很容易出现问题、并且定位不太容易,因此书中建议多使用JDK并发包提供的并发容器和工具类来解决并发问题。

参考:http://blog.csdn.net/wusd1256/article/details/78160552

相关文章
相关标签/搜索