您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > Java并发编程实践-电子书-03章
第三章使用JDK并发包构建程序第三章使用JDK并发包构建程序.......................................................................................13.1java.util.concurrent概述............................................................................................23.2原子量.......................................................................................................................23.2.1锁同步法...........................................................................................................33.2.2比较并交换.......................................................................................................43.2.3原子变量类.......................................................................................................63.2.4使用原子量实现银行取款...............................................................................83.3并发集合.................................................................................................................123.3.1队列Queue与BlockingQueue.........................................................................123.3.2使用ConcurrentMap实现类........................................................................193.3.3CopyOnWriteArrayList和CopyOnWriteArraySet..........................................203.4同步器.....................................................................................................................213.4.1Semaphore.......................................................................................................213.4.2Barrier.............................................................................................................243.4.3CountDownLatch............................................................................................273.4.4Exchanger........................................................................................................293.4.5Future和FutureTask........................................................................................313.5显示锁.....................................................................................................................333.5.1ReentrantLock.................................................................................................333.5.1.1ReentrantLock的特性..............................................................................343.5.1.2ReentrantLock性能测试..........................................................................383.5.2ReadWriteLock...............................................................................................423.6Fork-Join框架.........................................................................................................463.6.1应用Fork-Join.................................................................................................473.6.2应用ParallelArray...........................................................................................51参考文献.................................................................................................................................52(LinuxIDC.com)Ubuntu,Fedora,SUSEITLinux3.1java.util.concurrent概述JDK5.0以后的版本都引入了高级并发特性,大多数的特性在java.util.concurrent包中,是专门用于多线并发编程的,充分利用了现代多处理器和多核心系统的功能以编写大规模并发应用程序。主要包含原子量、并发集合、同步器、可重入锁,并对线程池的构造提供了强力的支持。原子量是定义了支持对单一变量执行原子操作的类。所有类都有get和set方法,工作方法和对volatile变量的读取和写入一样。并发集合是原有集合框架的补充,为多线程并发程序提供了支持。主要有:BlockingQueue,ConcurrentMap,ConcurrentNavigableMap。同步器提供了一些帮助在线程间协调的类,包括semaphores,barriers,latches,exchangers等。一般同步代码依靠内部锁(隐式锁),这种锁易于使用,但是有很多局限性。新的Lock对象支持更加复杂的锁定语法。和隐式锁类似,每一时刻只有一个线程能够拥有Lock对象,通过与其相关联的Condition对象,Lock对象也支持wait和notify机制。线程完成的任务(Runnable对象)和线程对象(Thread)之间紧密相连。适用于小型程序,在大型应用程序中,把线程管理和创建工作与应用程序的其余部分分离开更有意义。线程池封装线程管理和创建线程对象。线程池在第一章已经讲过,不再赘述。3.2原子量近来关于并发算法的研究主要焦点是无锁算法(nonblockingalgorithms),这些无锁算法使用低层原子化的机器指令,例如使用compare-and-swap(CAS)代替锁保证并发情况下数据的完整性。无锁算法广泛应用于操作系统与JVM中,比如线程和进程的调度、垃圾收集、实现锁和其他并发数据结构。在JDK5.0之前,如果不使用本机代码,就不能用Java语言编写无等待、无锁定的算法。在java.util.concurrent中添加原子变量类之后,这种情况发生了变化。本节了解这些新类开发高度可伸缩的无阻塞算法。(LinuxIDC.com)Ubuntu,Fedora,SUSEITLinux要使用多处理器系统的功能,通常需要使用多线程构造应用程序。但是正如任何编写并发应用程序的人可以告诉你的那样,要获得好的硬件利用率,只是简单地在多个线程中分割工作是不够的,还必须确保线程确实大部分时间都在工作,而不是在等待更多的工作,或等待锁定共享数据结构。如果线程之间不需要协调,那么几乎没有任务可以真正地并行。以线程池为例,其中执行的任务通常相互独立。如果线程池利用公共工作队列,则从工作队列中删除元素或向工作队列添加元素的过程必须是线程安全的,并且这意味着要协调对头、尾或节点间链接指针所进行的访问。正是这种协调导致了所有问题。3.2.1锁同步法在Java语言中,协调对共享字段访问的传统方法是使用同步,确保完成对共享字段的所有访问,同时具有适当的锁定。通过同步,可以确定(假设类编写正确)具有保护一组访问变量的所有线程都将拥有对这些变量的独占访问权,并且以后其他线程获得该锁定时,将可以看到对这些变量进行的更改。弊端是如果锁定竞争太厉害(线程常常在其他线程具有锁定时要求获得该锁定),会损害吞吐量,因为竞争的同步非常昂贵。对于现代JVM而言,无竞争的同步现在非常便宜。基于锁的算法的另一个问题是:如果延迟具有锁的线程(因为页面错误、计划延迟或其他意料之外的延迟),则没有要求获的锁的线程可以继续运行。还可以使用volatile变量来以比同步更低的成本存储共享变量,但它们有局限性。虽然可以保证其他变量可以立即看到对volatile变量的写入,但无法呈现原子操作的读-修改-写顺序,这意味着volatile变量无法用来可靠地实现互斥(互斥锁定)或计数器。下面以实现一个计数器为例。通常情况下一个计数器要保证计数器的增加,减少等操作需要保持原子性,使类成为线程安全的类,从而确保没有任何更新信息丢失,所有线程都看到计数器的昀新值。使用内部锁实现的同步代码一般如下:packagejdkapidemo;publicclassSynchronizedCounter{privateintvalue;publicsynchronizedintgetValue(){returnvalue;}publicsynchronizedintincrement(){(LinuxIDC.com)Ubuntu,Fedora,SUSEITLinuxreturn++value;}publicsynchronizedintdecrement()
本文标题:Java并发编程实践-电子书-03章
链接地址:https://www.777doc.com/doc-5987873 .html