Synchronized和Reentrantlock的区别
- Synchronized是Java中的关键字,而Reentrantlock则是一个实现类
- JDK1.6之后Synchronized引入了锁升级的机制,这使他和Reentrantlock的性能几乎相差无几了。
- Synchronized是不可中断锁,也就说一旦你尝试开始等待获取一个锁,那你就嗯等,等到这个锁被释为止,而Reentrantlock则是可中断锁,他可以使用tryLock(设置Timeout的时间值)来获取锁,一旦超时就不再等待,然后返回False。
- 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
- volatile不读取线程栈中的缓存而是强制读取硬盘中的值,确保可见性。
- volatile禁止指令重排序
int a = 1;//第1条指令
int b = 2;//第2条指令