您的位置:首页 > 编程语言 > Java开发

Java高并发程序-Chapter5 锁的优化及注意事项(第二十九讲)锁优化思路和建议

2018-03-29 09:52 609 查看


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 



对于 Concurrenthashmap,它内部进一步细分了若干个小的 Hashmap,称之为段( SEGMENT)
默认情况下,一个 Concurrenthash Map被进一步细分为16个段
如果需要在 Concurrenthashmap中增加一个新的表项,并不是将整个 Hash Map加锁,
而是首先根据 hashcode得到该表项应该被存放到哪个段中,然后对该段加锁,并完成put操作。
在多线程环境中,如果多个线程同时进行put操作,只要被加入的表项不存放在同一个段中,则线程间便可以做到真正的并行。
3. 读写分离锁
在读多写少的场合,使用读写锁可以有效提升系统的并发能力
使用读写锁 ReadwriteLock可以提高系统的性能

使用读写分离锁来替代独占锁是减小锁粒度的一种特殊情况。如果说上节中提到的减少锁粒度是通过分割数据结构实现的,那么,读写锁则是对系统功能点的分割



4.锁分离
读写分离思想可以延伸,只要操作互不影响,锁就可以分离 
LinkedBlockingQueue
  队列
  链表

 


5.锁粗化
通常情况下,为了保证多线程间的有效并发,会要求每个线程持有锁的时间尽量短,即在使用完公共资源后,应该立即释放锁。只有这样,等待在这个锁上的其他线程才能尽早的获得资源执行任务但是,凡事都有一个度,如果对同一个锁不停的进行请求、同步和释放,其本身也会消耗系统宝贵的资源,反而不利于性能的优化。



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  并发编程