1、减少锁持有时间:(根据有效的条件去减少锁住的代码)
public Matcher matcher(CharSequence input) { if (!compiled) { synchronized(this) { if (!compiled) compile(); } } Matcher m = new Matcher(this, input); return m; }
2、减少锁的颗粒度(将大面积分成小面积)
ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment是一种可重入锁ReentrantLock,在ConcurrentHashMap里扮演锁的角色,HashEntry则用于存储键值对数据。
一个Segment里包含一个HashEntry数组,每个HashEntry是一个链表结构的元素,每个Segment守护一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须首先获得它对应的Segment锁。
3、读写分离锁替代独占锁
在读远远大于写操作的系统中,用读写锁
4、分离锁
如:BlockingQueue中的put(),take(),就是分离锁操作,相互独立
5、锁粗化(和减少锁的颗粒度相反,主要是减少锁的使用频率)
如:for(int i=0;i....){
synchronized(lock){}
}
应该优化为
synchronized(lock){ for(.....){} }
这样避免了频繁的获取锁,和释放锁
ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment是一种可重入锁ReentrantLock,在ConcurrentHashMap里扮演锁的角色,HashEntry则用于存储键值对数据。