1. 减少锁的持有时间
减少锁的持有时间有助于降低锁冲突的可能性,进而提升系统的并发能力
Good Example:
2. 减少锁粒度
所谓减少锁粒度,就是指缩小锁定对象的范围,从而减少锁冲突的可能性,进而提高系统的并发能力。
将大对象,拆成小对象,大大增加并行度,降低锁竞争
偏向锁,轻量级锁成功率提高
HashMap的同步实现
–Collections.synchronizedMap(Map<K,V> m)
–返回SynchronizedMap对象
ConcurrentHashMap
–若干个Segment :Segment<K,V>[] segments
–Segment中维护HashEntry<K,V>
–put操作时
先定位到Segment,锁定一个Segment,执行put
默认情况下,一个 Concurrenthash Map被进一步细分为16个段
如果需要在 Concurrenthashmap中增加一个新的表项,并不是将整个 Hash Map加锁,
而是首先根据 hashcode得到该表项应该被存放到哪个段中,然后对该段加锁,并完成put操作。
在多线程环境中,如果多个线程同时进行put操作,只要被加入的表项不存放在同一个段中,则线程间便可以做到真正的并行。
3. 读写分离锁
在读多写少的场合,使用读写锁可以有效提升系统的并发能力
使用读写锁 ReadwriteLock可以提高系统的性能
使用读写分离锁来替代独占锁是减小锁粒度的一种特殊情况。如果说上节中提到的减少锁粒度是通过分割数据结构实现的,那么,读写锁则是对系统功能点的分割
4.锁分离
读写分离思想可以延伸,只要操作互不影响,锁就可以分离
LinkedBlockingQueue
队列
链表
5.锁粗化
通常情况下,为了保证多线程间的有效并发,会要求每个线程持有锁的时间尽量短,即在使用完公共资源后,应该立即释放锁。只有这样,等待在这个锁上的其他线程才能尽早的获得资源执行任务但是,凡事都有一个度,如果对同一个锁不停的进行请求、同步和释放,其本身也会消耗系统宝贵的资源,反而不利于性能的优化。