java特种兵读书笔记(5-4)——并发之JDK
来源:互联网 发布:php微信wap支付 demo 编辑:程序博客网 时间:2024/06/06 11:02
对于一些集合类,比如ArrayList,LinkedList,HashMap等等,我们可能会用锁来处理对它们的并发读写操作,或者通过java本身提供的集合类来解决并发问题。
以List为例,对于列表结构,如果要控制并发读写操作,以前要么自己加锁处理,要么利用Vector集合类,但是这会导致一些问题,暂且不说synchronized本身的开销,还会导致锁的粒度非常大。
比如Vector中元素非常多,每次读写操作会将数组中所有的元素访问都锁住,一个线程访问Vector中下标为1的元素,另一个线程访问Vector下标为2的元素,而且都是读操作,这样也会互斥。
CopyOnWrite
读操作能够并发执行,写操作是拷贝一份数据出来修改,修改后的数组为最新版本,将它赋值给内部的数组或者链表的引用。这比读写锁中对于读操作的控制粒度更低,因为写操作发生时,读操作依然可以进行。
有CopyOnWriteArrayList和CopyOnWriteArraySet,利用拷贝空间换取锁粒度的降低,适合读多写少的场合。对于并发的写操作依然是排它的,不允许两个操作同时写,当写非常频繁的时候,首先数组不会太小,所以拷贝出来的空间也会越大,会产生大量的垃圾碎片,这样还不如直接使用锁。
ConcurrentHashMap
key和value都不允许为空。它降map默认分为16段,每一段叫做segment,segment之间不存在并发征用(并行度可以修改,使用重载构造方法即可)。这样首先不需要拷贝大量内存,其次写的互斥只存在于同一个segment上面。
0 0
- java特种兵读书笔记(5-4)——并发之JDK
- java特种兵读书笔记(5-5)——并发之常见并发编程工具
- java特种兵读书笔记(5-1)——并发之基础介绍
- java特种兵读书笔记(5-2)——并发之线程安全
- java特种兵读书笔记(5-3)——并发之原子性与锁
- java特种兵读书笔记(5-6)——并发之线程池与调度池
- java特种兵读书笔记(5-7)——编写并发程序要注意什么
- java特种兵读书笔记(5-8)——其他并发编程知识
- java特种兵读书笔记(3-5)——java程序员的OS之OOM
- java特种兵读书笔记(3-4)——java程序员的OS之对象内存结构
- java特种兵读书笔记(4-1)——java通信之概述
- java特种兵读书笔记(4-2)——java通信之IO与内存
- java特种兵读书笔记(4-3)——java通信之IO与通信调度方式
- java特种兵读书笔记(3-6)——java程序员的OS之JAVA常用工具
- java特种兵读书笔记(4-4)——java通信之tomcat对IO请求的处理
- java特种兵读书笔记(3-2)——java程序员的OS之虚拟机的板块
- java特种兵读书笔记(3-3)——java程序员的OS之虚拟机回收算法
- java特种兵读书笔记(2-3)——计算机原理之网络与数据库
- Android 的性能 I-内存的管理技巧
- HDOJ 1027Ignatius and the Princess II(全排列)
- PHP 文件读写操作(一)简易版
- PHP常用的文件操作(二)详细版
- IOS开发系列(一) - Xcode
- java特种兵读书笔记(5-4)——并发之JDK
- atime ctime mtime
- poj1466
- 简易天气api
- LightOJ 1163 - Bank Robbery (思维方程式求解)
- POJ 2479 (动态规划)
- 判断文件编码
- poj2724
- HTTP报文