当前位置: 首页 > 编程日记 > 正文

java并发编程——并发容器类介绍

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

并发容器的简单介绍

JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能。因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发性,当多个线程竞争容器时,吞吐量严重降低。因此Java5.0开始针对多线程并发访问设计,提供了并发性能较好的并发容器,引入了java.util.concurrent包。与Vector和Hashtable、Collections.synchronizedXxx()同步容器等相比,util.concurrent中引入的并发容器主要解决了两个问题:

  • 1)根据具体场景进行设计,尽量避免synchronized,提供并发性。
  • 2)定义了一些并发安全的复合操作,并且保证并发环境下的迭代操作不会出错。

util.concurrent中容器在迭代时,可以不封装在synchronized中,可以保证不抛异常,但是未必每次看到的都是"最新的、当前的"数据。

并发容器类简单介绍

ConcurrentHashMap

  • 对应的非并发容器:HashMap
  • 目标:代替Hashtable、synchronizedMap,支持复合操作
  • 原理:JDK6中采用一种更加细粒度的加锁机制Segment“分段锁”,JDK8中采用CAS无锁算法。

CopyOnWriteArrayList

  • 对应的非并发容器:ArrayList
  • 目标:代替Vector、synchronizedList
  • 原理:利用高并发往往是读多写少的特性,对读操作不加锁,对写操作,先复制一份新的集合,在新的集合上面修改,然后将新集合赋值给旧的引用,并通过volatile 保证其可见性,当然写操作的锁是必不可少的了。

CopyOnWriteArraySet

  • 对应的费并发容器:HashSet
  • 目标:代替synchronizedSet
  • 原理:基于CopyOnWriteArrayList实现,其唯一的不同是在add时调用的是CopyOnWriteArrayList的addIfAbsent方法,其遍历当前Object数组,如Object数组中已有了当前元素,则直接返回,如果没有则放入Object数组的尾部,并返回。

ConcurrentSkipListMap

  • 对应的非并发容器:TreeMap
  • 目标:代替synchronizedSortedMap(TreeMap)
  • 原理:Skip list(跳表)是一种可以代替平衡树的数据结构,默认是按照Key值升序的。Skip list让已排序的数据分布在多层链表中,以0-1随机数决定一个数据的向上攀升与否,通过”空间来换取时间”的一个算法。ConcurrentSkipListMap提供了一种线程安全的并发访问的排序映射表。内部是SkipList(跳表)结构实现,在理论上能够在O(log(n))时间内完成查找、插入、删除操作。

ConcurrentSkipListSet

  • 对应的非并发容器:TreeSet
  • 目标:代替synchronizedSortedSet
  • 原理:内部基于ConcurrentSkipListMap实现

ConcurrentLinkedQueue

  • 不会阻塞的队列
  • 对应的非并发容器:Queue
  • 原理:基于链表实现的FIFO队列(LinkedList的并发版本)

LinkedBlockingQueue、ArrayBlockingQueue、PriorityBlockingQueue

  • 对应的非并发容器:BlockingQueue
  • 特点:拓展了Queue,增加了可阻塞的插入和获取等操作
  • 原理:通过ReentrantLock实现线程安全,通过Condition实现阻塞和唤醒
  • 实现类:
    • LinkedBlockingQueue:基于链表实现的可阻塞的FIFO队列
    • ArrayBlockingQueue:基于数组实现的可阻塞的FIFO队列
    • PriorityBlockingQueue:按优先级排序的队列

转载于:https://my.oschina.net/cqqcqqok/blog/2231299

相关文章:

CV_IMAGE_ELEM参数赋值时注意的问题

转自:http://hi.baidu.com/wangruiy01/blog/item/041ab03e8abd33c57d1e71a0.html CV_IMAGE_ELEM是一个宏, #define CV_IMAGE_ELEM( image, elemtype, row, col ) /(((elemtype*)((image)->imageData (image)->widthStep*(row)))[(col)])#define …

公司内部exchange2010 下删除误发邮件

1、Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E20102、get-mailbox | search-mailbox -SearchQuery 填写误发邮件标题 -TargetMailbox "administrator" -TargetFolder "SearchAndDeleteLog" -DeleteContent转载于:https://blog.51cto.com/wo…

从代码设计到应用开发,入坑深度学习看这本书就够了

深度学习(Deep Learning)是机器学习中一种基于对数据进行表征学习的方法。近年来,深度学习已经在科技界、工业界日益广泛地应用。随着全球各领域多样化数据的极速积累和计算资源的成熟化商业服务,深度学习已经成为人工智能领域最有…

小波矩特征提取matlab代码

这是我上研究生时写的小波矩特征提取代码: %新归一化方法小波矩特征提取---------------------------------------------------------- Fimread(a1.bmp);Fim2bw(F);Fimresize(F,[128 128]);%求取最上点for i1:128 for j1:128 if (F(i,j)1) yt…

hadoop生态搭建(3节点)-06.hbase配置

# http://archive.apache.org/dist/hbase/1.2.4/ # 安装 hbase tar -zxvf ~/hbase-1.2.4-bin.tar.gz -C /usr/local rm –r ~/hbase-1.2.4-bin.tar.gz # 配置环境变量# node1 node2 node3 vi /etc/profile# 在export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL下添…

异类框架BigDL,TensorFlow的潜在杀器!

作者 | Nandita Dwivedi译者 | 风车云马责编 | Jane出品 | AI 科技大本营(id:rgznai100)【导读】你能利用现有的 Spark 集群构建深度学习模型吗?如何分析存储在 HDFS、Hive 和 HBase 中 tb 级的数据吗?企业想用深度学习…

对IsUnderPostmaster变量初步学习

开始 在postmaster.c 中的 BackendStartup 中,有如下的代码: 其中定义了 IsUnderPostmastertrue。 而bgwriter 作为 postmaster 的子进程,它的 IsUnderPostmaster 也是为真。 * BackendStartup -- start backend process** returns: STATUS_…

C++读写ini配置文件GetPrivateProfileString()WritePrivateProfileString()

转自&#xff1a;http://hi.baidu.com/andywangcn/blog/item/10ba730f48160eeb37d122e9.html 配置文件中经常用到ini文件&#xff0c;在VC中其函数分别为&#xff1a; #include <Windows.h> //wince,WMobile.ppc不支持这几个函数 写入.ini文件&#xff1a;bool WritePriv…

地图下载2之天超图瓦片格式

接上一篇《地图下载1之天地图瓦片解析》&#xff0c;我们已经知道了天地图的瓦片格式&#xff0c;现在来分析一下超图中瓦片的存储结构。 其实&#xff0c;在GIS领域&#xff0c;只有像ESRI这样强大公司的SHP文件等能通用外&#xff0c;很多数据、格式等都不通用&#xff0c;都…

server 2003登录界面黑屏的解决办法

1、备份注册表&#xff08;为了安全起见&#xff09;具体办法&#xff1a;开始-> 运行窗口输入“regedit.exe”->回车->找到注册表->文件->导出->完成&#xff1b; 2、复制下面的文件内容到记事本然后另存为格式为.reg注册表扩展名导入注册表&#xff1b; Wi…

“学了半年后,我要揭开Python 3宗罪!”

有人曾说&#xff0c;未来只有2种人&#xff0c;会Python的人和....不懂Python的小学生&#xff0c;虽有夸张&#xff0c;这也意味着Python越来越重要了&#xff0c;究竟这门语言厉害在哪里&#xff1f;以下为你总结了Python3宗“罪”&#xff01;Python凭啥这么优秀&#xff1…

连表/子查询/计算的sql

看不懂的sql语句 1.select om.*,money,cus.c_type,cus.c_weixin_name,isnull(cus.c_discount,0) c_discount,isnull(om.o_money-om.o_money*cus.c_discount,0) money1,isnull(money*(i_year_pointi_month_potinti_piece_point),0) money2,isnull((om.o_money-om.o_money*cus.c_…

vc6静态库的生成和调用

1、静态库的生成&#xff1a; 在vc6.0中CtrlN选择Projects下的Win32 Static Library&#xff0c;Project name:SumLib,点击OK&#xff0c;下一页中的两项可选可不选&#xff0c;点击Finish完成。 在此工程中新建lib.h和lib.cpp两个文件&#xff0c;源码如下&#xff1a; //lib.…

实例变量的访问及数据封装

你已经看到处理分数的方法如何通过名称直接访问两个实例变量numerator和denominator。事实上&#xff0c;实例方法总是可以直接访问它的实例变量的。然而&#xff0c;类方法则不能&#xff0c;因为它只处理本身&#xff0c;并不处理任何类实例&#xff08;仔细想想&#xff09;…

清华成立视觉智能研究中心,邓志东任中心主任

整理 | 阿司匹林出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;6月21日&#xff0c;清华大学人工智能研究院视觉智能研究中心正式成立&#xff0c;清华大学副校长、清华大学人工智能研究院管委会主任尤政院士&#xff0c;清华大学人工智能研究院院长张钹院士出席成…

Java并发编程(一)Thread详解

一、概述 在开始学习Thread之前&#xff0c;我们先来了解一下 线程和进程之间的关系&#xff1a; 线程(Thread)是进程的一个实体&#xff0c;是CPU调度和分派的基本单位。 线程不能够独立执行&#xff0c;必须依存在应用程序中&#xff0c;由应用程序提供多个线程执行控制。 线…

MFC如何打开文件路径

转自&#xff1a;http://linyangmumu.blog.163.com/blog/static/6903134920101024419380/ 1.void OpenFile&#xff08;&#xff09; { CString m_FileDir; BROWSEINFO bi; ZeroMemory(&bi, sizeof(BROWSEINFO)); bi.hwndOwner m_hWnd; bi.ulFlags BIF_RETURNONL…

HDOJ_ACM_数塔

Problem Description在讲述DP算法的时候&#xff0c;一个经典的例子就是数塔问题&#xff0c;它是这样描述的&#xff1a;有如下所示的数塔&#xff0c;要求从顶层走到底层&#xff0c;若每一步只能走到相邻的结点&#xff0c;则经过的结点的数字之和最大是多少&#xff1f;已经…

会数据分析的人别再低调了,我怕你会因此错失100万奖金

大家好我是一般周一不冒头一冒头就不一般的柚柚今天我给大家带来了一个好消息那就是“易观方舟Argo杯数据创客大赛”开始接受报名了&#xff01;请不要怀疑就是那个国内领先的大数据公司——『易观』联合20家创新企业筹备了整整两个月的大赛正规、专业、含金量极高&#xff01;…

CxImage类库的简介

转自&#xff1a;http://www.sudu.cn/info/html/edu/20080403/259688.html CxImage类库是个优秀的图像操作类库。他能快捷地存取、显示、转换各种图像。有的读者可能说&#xff0c;有那么多优秀的图像库&#xff0c;如OpenIL,FreeImage,PaintLib等等&#xff0c;他们可谓是功能…

MySQL 5.5 服务器变量详解(二)

innodb_adaptive_flushing{ON|OFF} 设定是否允许MySQL服务器根据工作负载动态调整刷写InnoDB buffer pool中的脏页的速率。动态调整刷写速率的目的在于避免出现IO活动尖峰。默认值为ON。作用范围为全局级别&#xff0c;可用于选项文件&#xff0c;属动态变量。innodb_adaptive_…

一文掌握异常检测的实用方法 | 技术实践

作者 | Vegard Flovik译者 | Tianyu责编 | Jane出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】今天这篇文章会向大家介绍几个有关机器学习和统计分析的技术和应用&#xff0c;并展示如何使用这些方法解决一些具体的异常检测和状态监控实例。相信对一些开发…

票据自动处理系统著名研究团队

国际上对票据自动处理系统的研究始于上世纪80年代&#xff0c;俄罗斯、美国、加拿大、日本、巴西等国在这个领域的研究工作开展得比较深入&#xff0c;著名的研究团体如加拿大Concordia大学的CENPARMI中心、MIT的PROFIT实验室、俄罗斯ABBYY软件公司、Mitek Systems公司CheckQue…

iOS开发之AVKit框架使用

2019独角兽企业重金招聘Python工程师标准>>> iOS开发之AVKit框架使用 一、引言 在iOS开发框架中&#xff0c;AVKit是一个非常上层&#xff0c;偏应用的框架&#xff0c;它是基于AVFoundation的一层视图层封装。其中相关文件和类都十分简单&#xff0c;本篇博客主要整…

DirectX10 学习笔记2:在多文档框架中初始化DirectX 10

显示功能是在视图类中完成的&#xff0c;所以DX10的初始化及绘制工作都是视图类中完成。 首先建立一个多文档工程&#xff0c;工程名为02_01&#xff0c;在视图类头文件中加载相关的库&#xff0c;并包含头文件&#xff1a; 在视图类的头文件中添加DX10相关的成员&#xff1a; …

碾压Bert?“屠榜”的XLnet对NLP任务意味着什么

作者张俊林&#xff0c;中国中文信息学会理事&#xff0c;中科院软件所博士。目前担任新浪微博机器学习团队 AI Lab 负责人。在此之前&#xff0c;张俊林曾经在阿里巴巴任资深技术专家并负责新技术团队&#xff0c;以及在百度和用友担任技术经理及技术总监等职务。他是技术书籍…

ORACLE中通过DBMS_CRYPTO包对表敏感字段进行加密

http://doc.primeton.com/pages/viewpage.action?pageId4917998

02 使用百度地图获得当前位置的经纬度

O 需求 通过百度地图&#xff0c;获取用户当前位置的经纬度 一 准备 确保你已按照上篇《01 如何将百度地图加入IOS应用程序&#xff1f;》完成了相关功能。本篇将在上一篇的基础上进行修改。 二 编码 (New标示本次新添加的代码&#xff1b;Delete表示本次需要删除的代码&#x…

中文NLP的分词真有必要吗?李纪为团队四项任务评测一探究竟 | ACL 2019

作者| Yuxian Meng、Xiaoya Li、Xiaofei Sun、Qinghong Han、Arianna Yuan、 Jiwei Li译者 | Rachel责编 | Jane出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】通常&#xff0c;中文文本处理的第一步称为分词&#xff0c;这好像已经成为一种“共识”&#…

Netty 粘包 拆包 编码 解码 序列化 介绍

目录&#xff1a; 粘包 & 拆包及解决方案 ByteToMessageDecoder基于长度编解码器基于分割符的编解码器google 的 Protobuf 序列化介绍其他的前言 Netty 作为一个网络框架&#xff0c;对 TCP 连接中的问题都做了全面的考虑&#xff0c;比如粘包拆包导致的半包问题&#xff0…