IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 线程安全集合类概述 -> 正文阅读

[数据结构与算法]线程安全集合类概述

HashTable和Vector

遗留的线程安全实现:效率较低
	HashTable:map的实现
	Vector:list的实现

Collections中的带synchronized修饰实现类

如synchronizedMap。synchronizedList等
方法内部都加一个synchronized修饰,同步块中调用原来的方法。属于装饰器模式,对原来的List或者Map功能进行装饰

JUC

java.util.concurrent.*下面的集合类
	主要分为三类:
		Blocking类:大部分实现基于锁,并提供用来阻塞的方法
		CopOnWrite:拷贝后修改,容器修改开销相对较重
		Concurrent:
			内部很多操作使用 cas 优化,一般可以提供较高吞吐量
			弱一致性
				遍历时弱一致性,例如,当利用迭代器遍历时,如果容器发生修改,迭代器仍然可以继续进行遍历,这时内容是旧的
				求大小弱一致性,size 操作未必是 100% 准确
				读取弱一致性	
			遍历时如果发生了修改,对于非安全容器来讲,使用 fail-fast 机制也就是让遍历立刻失败,抛出ConcurrentModificationException,不再继续遍历

ConcurrentHashMap

原理见java面试题整理中的ConcurrentHashMap,地址:[java面试题](https://blog.csdn.net/MpenggegeM/article/details/123022267?spm=1001.2014.3001.5502)

LinkedBlockingQueue

原理:
	1、对象中维护一个内部Node对象,存放数据item内容,和next指向下一个Node
	2、初始化:生成一个Dummy Node节点,用来占位,item = null,next=null,Queue的head和last都指向这个Dummy对象
	3、入队:将last.next指向新加入的node,将last指向新加入的node;
	4、出队:
		用first变量指向head.next,也就是第一个有值的节点。
		将h=head对象,h.next=h指向自己,方便安全地进行GC
		将first.item赋值给变量返回。first.item又置为null,意思是变为Dummy节点。
		将head指向first
		总体描述就是,获得Dummy后面第一个节点的值,将这个节点置为Dummy,将原来的Dummy垃圾回收;
加锁分析:
	1、生产者消费者使用不同的锁,putlock和takelock
	2、当链表长度只有1个Dummy数据时,takelock的线程会阻塞
	3、当同类型锁await和signal时,如果put还有空位,或者还能take,只signal一个线程进行操作,减少竞争;
性能比较:
	主要列举 LinkedBlockingQueue 与 ArrayBlockingQueue 的性能比较:
		Linked 支持有界,Array 强制有界
		Linked 实现是链表,Array 实现是数组
		Linked 是懒惰的,而 Array 需要提前初始化 Node 数组
		Linked 每次入队会生成新 Node,而 Array 的 Node 是提前创建好的
		Linked 两把锁,Array 一把锁

ConcurrentLinkedQueue

ConcurrentLinkedQueue 的设计与 LinkedBlockingQueue 非常像
	1、两把【锁】,同一时刻,可以允许两个线程同时(一个生产者与一个消费者)执行
	2、dummy 节点的引入让两把【锁】将来锁住的是不同对象,避免竞争
	3、只是这【锁】使用了 cas 来实现

CopyOnWriteArrayList

1、写操作时,进行复制后再操作覆盖。因此不影响读,读线程无需加锁。
2、一般用于读多写少的状况
3、弱一致性,可能读的旧数据
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:50:27  更:2022-03-15 22:54:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 12:21:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码