高并发(Xmind)

本文介绍了Java并发编程中的关键概念,包括Synchronized与ReentrantLock的区别,如Synchronized的不可中断性和非公平性,以及ReentrantLock的可中断性和公平锁选项。同时,深入探讨了高并发容器ConcurrentHashMap的演进,从1.8以前的Segment分段锁到1.8后的Node槽式加锁。此外,还提到了CopyOnWrite容器的读写分离原理及其在CopyOnWriteArrayList中的应用。最后讨论了volatile关键字的作用,如确保可见性和禁止指令重排序,以及Atomic原子类的线程安全性。
摘要由CSDN通过智能技术生成

Synchronized和Reentrantlock的区别

  1. Synchronized是Java中的关键字,而Reentrantlock则是一个实现类
  2. JDK1.6之后Synchronized引入了锁升级的机制,这使他和Reentrantlock的性能几乎相差无几了。
  3. Synchronized是不可中断锁,也就说一旦你尝试开始等待获取一个锁,那你就嗯等,等到这个锁被释为止,而Reentrantlock则是可中断锁,他可以使用tryLock(设置Timeout的时间值)来获取锁,一旦超时就不再等待,然后返回False。
  4. Synchronized是非公平锁,而Reentrantlock可以实现非公平锁/公平锁

高并发容器——ConcurrentHashMap
1.8以前采用的是Segment分段式锁数组+数组+链表的结构,第一个数组(Segment)大小不变(默认为16)不可扩容,第二个数组(HashEntry)可以扩容,第二个数组的每个槽位都是一个链表的头节点,采用头插法,每次锁的话就是锁一个Segment。那有两个数组,自然需要两次Hash,效率低呀,而且加锁(ReentrantLock)的粒度也大呀,整个Segment下面的数组和链表全部锁了。

1.8以后则是Node槽式加锁CAS和Synchronized,只用一次Hash,锁的粒度也更小了,其他的扩容机制与HashMap相同,且采用了尾插法。

高并发容器——CopyOnWrite容器
其实就是读写分离的一个思想,写操作互斥,读操作共享。比如说CopyOnWriteArrayList底层实现就是写的时候复制一个副本,在副本上进行一个写操作,在原先的List上一个写锁,读的话就完全没问题,读取旧值,写完了之后,新的副本代替原先的旧值即可。

volatile和atomic

  1. volatile不读取线程栈中的缓存而是强制读取硬盘中的值,确保可见性。
  2. volatile禁止指令重排序
int a = 1;//第1条指令
int b = 2;//第2条指令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值