Java并发编程之基础构建模块
2018-02-23 15:08
381 查看
线程安全性委托给现有的线程安全类是一个有效的策略,只要让现有的线程安全类管理所有的状态即可。Java平台类库中包含了丰富的并发基础构建模块,比如线程安全的容器类以及各种用于协调多个相互协作的线程控制流的同步工具类(Synchronizer)。
同步容器类:包括Vector和Hashtable。这些类实现线程安全的方式是:将它们的状态封装起来,并对每个公有方法都进行同步,使得每次都有一个线程能访问容器的状态。
同步容器类是安全的,但在某些情况下需要额外的客户端加锁来保护复合操作。容器上常见的复合操作有迭代、跳转以及条件运算(例如“若没有则添加”)。当其他线程并发的修改容器时它们可能会出错。也就是说同步容器类还是需要支持客户端加锁,来保证原子性,这样才可以保证线程安全。
并发容器:同步容器是将所有对容器状态的访问都串行化,以实现它们的线程安全性。这种方法的代价就是降低了并发性,当多个线程竞争容器时,吞吐量严重降低。而并发容器是针对多个线程并发访问设计的。
ConcurrentHashMap:是用分段锁来实现更大程度的共享,只有当应用程序需要加锁Map以进行独占访问时,才放弃使用这个类。因为它不能被加锁来执行独占访问。
CopyOnWriteArrayList:写入时复制,容器的线程安全性在于只要正确发布一个事实不可变对象,那么在访问该对象时就不在需要进一步的同步了。
同步工具类:
1.闭锁:可以延迟线程的进度直到其到达终止状态。闭锁就相当于一扇门:在闭锁到达结束状态之前,门一直关着,并且没有任何线程可以通过,当到达结束状态时,这扇门打开,允许所有的线程通过,并且一直保持打开状态,闭锁可以确保某些活动直到其他活动都完成才继续执行。CountDownLatch就是一种灵活的闭锁实现。FutureTask也可以作为一种闭锁。
2.信号量:用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量。Semaphore就是一种信号量实现。
3.栅栏:栅栏类似于闭锁,它能阻塞一组线程直到某个事件发生。栅栏跟闭锁的区别在于所有线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏用于等待其他线程。CyclicBarrier是一种栅栏实现,它可以使一定数量的参与方反复的在栅栏位置聚集,它在并行迭代算法中非常常用。另一种栅栏形式是Exchanger:它是一种两方栅栏,各方的栅栏位置交换数据,例如当一个线程向缓冲区写入数据,而另一个线程从缓冲区读取数据。这些线程可以用Exchanger来汇合,并将满的缓冲区与空的缓冲区交换。
同步容器类:包括Vector和Hashtable。这些类实现线程安全的方式是:将它们的状态封装起来,并对每个公有方法都进行同步,使得每次都有一个线程能访问容器的状态。
同步容器类是安全的,但在某些情况下需要额外的客户端加锁来保护复合操作。容器上常见的复合操作有迭代、跳转以及条件运算(例如“若没有则添加”)。当其他线程并发的修改容器时它们可能会出错。也就是说同步容器类还是需要支持客户端加锁,来保证原子性,这样才可以保证线程安全。
并发容器:同步容器是将所有对容器状态的访问都串行化,以实现它们的线程安全性。这种方法的代价就是降低了并发性,当多个线程竞争容器时,吞吐量严重降低。而并发容器是针对多个线程并发访问设计的。
ConcurrentHashMap:是用分段锁来实现更大程度的共享,只有当应用程序需要加锁Map以进行独占访问时,才放弃使用这个类。因为它不能被加锁来执行独占访问。
CopyOnWriteArrayList:写入时复制,容器的线程安全性在于只要正确发布一个事实不可变对象,那么在访问该对象时就不在需要进一步的同步了。
同步工具类:
1.闭锁:可以延迟线程的进度直到其到达终止状态。闭锁就相当于一扇门:在闭锁到达结束状态之前,门一直关着,并且没有任何线程可以通过,当到达结束状态时,这扇门打开,允许所有的线程通过,并且一直保持打开状态,闭锁可以确保某些活动直到其他活动都完成才继续执行。CountDownLatch就是一种灵活的闭锁实现。FutureTask也可以作为一种闭锁。
2.信号量:用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量。Semaphore就是一种信号量实现。
3.栅栏:栅栏类似于闭锁,它能阻塞一组线程直到某个事件发生。栅栏跟闭锁的区别在于所有线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏用于等待其他线程。CyclicBarrier是一种栅栏实现,它可以使一定数量的参与方反复的在栅栏位置聚集,它在并行迭代算法中非常常用。另一种栅栏形式是Exchanger:它是一种两方栅栏,各方的栅栏位置交换数据,例如当一个线程向缓冲区写入数据,而另一个线程从缓冲区读取数据。这些线程可以用Exchanger来汇合,并将满的缓冲区与空的缓冲区交换。
相关文章推荐
- Java并发编程基础构建模块(03)——阻塞队列
- Java并发编程学习——《Java Concurrency in Practice》学习笔记 5.基础构建模块
- Java并发编程(一)之基础知识(基础构建模块)
- Java并发编程基础构建模块(01)——同步容器类
- Java并发编程基础构建模块(01)——同步容器类
- Java并发编程基础构建模块(02)——并发容器
- Java并发编程基础构建模块(02)——并发容器
- Java并发编程基础构建模块(04)——线程阻塞与中断
- Java并发编程基础构建模块(05)——同步工具类
- Java并发编程基础构建模块(04)——线程阻塞与中断
- Java并发编程基础构建模块(06)——高效缓存总结示例
- 《java并发编程实战》基础构建模块(六)
- Java 并发编程之基础构建模块
- Java并发编程实战(学习笔记四 第五章 基础构建模块 上)
- 第5章 基础构建模块
- java并发编程实战学习(3)--基础构建模块
- 《Java并发编程实战》 阅读笔记 5. 基础构建模块
- java并发编程实战:基础构建模块笔记
- Java中的基础构建模块(第五章)