并发容器
读写锁ReentrantReadWriteLock
排斥性
+当有一个readLock读锁时,不会排斥其他的读锁
可多线程同时进行
+当有一个writeLock写锁时,会拒绝所有的读写锁
只能单线程进行
CopyOnWriteArrayList与ArrayList的区别
+ CopyOnWriteArrayList没有初始容量的说法,需要添加元素时长度+1
+ CopyOnWriteArrayList涉及添加修改的时候使用ReentrantLock加锁,保证线程安全
+ CopyOnWriteArrayList遍历时不能进行删除操作,LinkedList在遍历时可以删除
+ ArrayList线程不安全,为了拒绝多线程边读边写的情况,引入了falsefast快速失败的过程
+ CopyOnWriteArrayList迭代使用snapshot快照,没有快速失败过程
CopyOnWriteArrayList优缺点
优点
+ 在写操作的同时允许读操作,大大提高了读操作的性能
缺点
+ 内存占用:如果CopyOnWriteArrayList经常要增删改里面的数据,经常要执行add()、set()、remove()的话,那是比较耗费内存的。
+ 数据一致性:CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。
ConcurrentHashMap
+写入过程,cas表征安全,实际不安全,独占锁过程安全
+与HashMap对比,链接: HashMap底层.
线程小工具
CountDownLatch
声明格式:
CountDownLatch cd = new CountDownLatch(5);
latch.wait() 执行的线程会被阻塞,直至计数器归零
latch.Count() 每执行一次,计数器减一,直至计数器归零,所有await线程才能开始执行
一次性通过后失效
CyclicBarrier循环栅栏
循环执行
Semaphore 信号量
初始化格式:
Semaphore semaphore = new Semaphore(10);
请求不能超过最大
semaphore.acquire(5);
释放数可以大于请求数字
semaphore.release(8);
释放默认最少1
最后结果为
原来的-获得的+还了的
上面例子的结果为:13