Java并发-容器
同步容器类:同步容器类包括Vector和Hashtable。这些类实现线程安全的方式是:将它们的状态封装起来,并对每个公有方法进行同步,使得每次只有一个线程可以访问容器的状态。JDK1.2之后,提供了工厂封装类,由Collections.sysnchronziedXX静态方法提供。
由于同步容器类要遵守同步规则,就是支持客户端加锁,因此会创建一些新的操作,只要我们知道应用的是哪一个锁,那么这些操作就是可以认为是原子操作。
并发容器
Java5.0提供了多种并发容器来改进同步容器的性能。同步容器将所有对容器状态的访问都串行化,从而实现线程安全性。这种方法的代价是严重降低并发性,当多个线程竞争容器的锁时,吞吐量就会严重降低。
同步容器类在执行的每个操作期间都持有一个锁。在一些操作中,例如HashMap.get或List.contains,可能包含大量的工作:当遍历散列通或链表来查找某个特定的对象时,必须在许多元素上调用equals。在基于散列的容器中,如果hashCode不能均匀分布散列值,那么容器的元素就不会均匀的分布在整个容器中。某些情况下,某个糟糕的散列函数还会把一个散列表变成线性链表。当遍历很长的链表并且在某些或者全部元素上调用equals方法时,就会花费很长的时间,这时候其他的线程就不能够访问容器。
ConcurrentHashMap也是一个基于散列的Map,但是它使用了一种完全不同的加锁机制来提供更高的并发性和伸缩性。ConcurrentHashMap并不是将每个方法都在同一个锁上同步并使得每次只能有一个线程访问容器,而是使用一种粒度更细的加锁机制来实现最大限度的共享,这种机制叫做分段锁。在这种机制下,任意数量的线程可以并发的访问Map。ConcurrentHashMap在并发环境下可以实现更高的吞吐量,在单线程环境下只损失非常小的性能。
阻塞队列和生产者-消费者模式
如果队列满了,那么put方法将阻塞到有空间可用。如果队列空了,那么take方法将会阻塞到有元素可用。
阻塞队列支持生产者-消费者这种设计模式,该模式将“找出需要完成的工作”与“执行工作”两个过程分开,并把工作项放入一个待完成列表以便以后完成。生产者-消费者模式可以简化开发过程,因为它消除了生产者类和消费者类之间的代码依赖性。
阻塞与中断
线程可能会阻塞或暂停执行:等待IO结束、等待获得一个锁、等待从sleep中醒来、等待另一个线程等。
Thread提供了interrupt方法,用来判断线程是否被中断(布尔型)。中断属于之中协作机制,一个线程不能强制其他线程停止正在执行的操作去执行其他的操作,只是要求其他线程执行到某个可以暂停的地方停止正在执行的操作,当然必须其他线程愿意停止下来。
Java并发-容器的更多相关文章
- java 并发容器一之BoundedConcurrentHashMap(基于JDK1.8)
最近开始学习java并发容器,以补充自己在并发方面的知识,从源码上进行.如有不正确之处,还请各位大神批评指正. 前言: 本人个人理解,看一个类的源码要先从构造器入手,然后再看方法.下面看Bounded ...
- Java并发编程系列-(5) Java并发容器
5 并发容器 5.1 Hashtable.HashMap.TreeMap.HashSet.LinkedHashMap 在介绍并发容器之前,先分析下普通的容器,以及相应的实现,方便后续的对比. Hash ...
- Java 并发系列之六:java 并发容器(4个)
1. ConcurrentHashMap 2. ConcurrentLinkedQueue 3. ConcurrentSkipListMap 4. ConcurrentSkipListSet 5. t ...
- 《Java并发编程的艺术》第6/7/8章 Java并发容器与框架/13个原子操作/并发工具类
第6章 Java并发容器和框架 6.1 ConcurrentHashMap(线程安全的HashMap.锁分段技术) 6.1.1 为什么要使用ConcurrentHashMap 在并发编程中使用Has ...
- java并发容器(Map、List、BlockingQueue)
转发: 大海巨浪 Java库本身就有多种线程安全的容器和同步工具,其中同步容器包括两部分:一个是Vector和Hashtable.另外还有JDK1.2中加入的同步包装类,这些类都是由Collectio ...
- java并发容器
同步容器将所有对容器状态的访问都串行化,以实现线程安全性.这种方式的缺点是严重降低并发性.Java 5.0提供了多种并发容器来改进同步容器的性能.如ConcurrentHashMap代替同步且基于散列 ...
- java并发容器(Map、List、BlockingQueue)具体解释
Java库本身就有多种线程安全的容器和同步工具,当中同步容器包含两部分:一个是Vector和Hashtable.另外还有JDK1.2中增加的同步包装类.这些类都是由Collections.synchr ...
- Java并发容器--ConcurrentHashMap
引子 1.不安全:大家都知道HashMap不是线程安全的,在多线程环境下,对HashMap进行put操作会导致死循环.是因为多线程会导致Entry链表形成环形数据结构,这样Entry的next节点将永 ...
- 【java并发容器】并发容器之CopyOnWriteArrayList
原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容 ...
- 14个Java并发容器,你用过几个?
作者:acupt 前言 不考虑多线程并发的情况下,容器类一般使用ArrayList.HashMap等线程不安全的类,效率更高.在并发场景下,常会用到ConcurrentHashMap.ArrayBlo ...
随机推荐
- 从JDK源码角度看java并发的原子性如何保证
JDK源码中,在研究AQS框架时,会发现很多地方都使用了CAS操作,在并发实现中CAS操作必须具备原子性,而且是硬件级别的原子性,java被隔离在硬件之上,明显力不从心,这时为了能直接操作操作系统层面 ...
- Miscellaneous Articles
标记一下,慢慢看 http://www.oracle-base.com/articles/misc/articles-misc.php Miscellaneous Articles DBA Deve ...
- Android开发技巧——TextView加载HTML的图片及代码显示问题
前几天在做一个Gradle用户指南的应用程序,使用的是TextView来加载HTML内容(至于为什么不用WebView,我也没有认真使用并比较过,也许以后会换吧),其中遇见了一些纠结的问题,所幸主要的 ...
- NSDate-日期类 OC——第七天(1)
1.总结前面学习的Oc中的几种数据类型 NSInteger NSUinteger CGFloat NSString NSMutableString NSSArray NSMutableArray NS ...
- Linux 学习笔记_12_文件共享服务_4_SSH
SSH文件共享服务 一.ssh远程登录[一般的Linux系统都会默认安装并启用] 1.Linux上远程命令行登录:ssh 用户名@远程主机IP地址 常用选项: -2:表示SSH2,强制使用第二代SSH ...
- ISLR系列:(4.2)模型选择 Ridge Regression & the Lasso
Linear Model Selection and Regularization 此博文是 An Introduction to Statistical Learning with Applicat ...
- DBUtils源码分析
其实,在这篇文章里,我只是分析了dbutis的query的运作流程. 至于类为什么要这样设计,蕴含的设计模式等等高级知识点咱们在下节再探讨. 先看看最简单的DBUtils是如何工作的. 数据库里有一张 ...
- 网络I/O中的同步、异步、阻塞和非阻塞概念
在学习网络编程过程中,经常会把这几个概念搞混淆. 同步I/O与异步I/O区别 我们先来看一下操作I/O时涉及的对象和步骤(这里我们以read为例): 这里会涉及到两个系统对象,一个是调用这个I/O的应 ...
- ExtJS:菜单ComboBox及级联菜单应用
首页一级菜单查询分组,二级菜单查询分组中的车辆信息. 定义分组数据模型: Ext.define( 'group', { extend:'Ext.data.Model', fields:[ {name: ...
- 网站开发进阶(十一)如何将一个jsp页面嵌套在另一个页面中
如何将一个jsp页面嵌套在另一个页面中 这个在做网页中常要用到,有些通用的内容可集中放在一个页面文件中,其它要用到这些内容的页面只需要包含(引用)这个通用文件即可.这样便于维护,如果有很多网页,当通用 ...