- 减少锁持有时间
public synchronized void syncMethod() {
othercode1();
mutextMethod();
othercode2();
}
public void syncMethod() {
othercode1();
synchronized mutextMethod();
othercode2();}
- 减小锁粒度
将大对象,拆成小对象,大大增加并行度,降低锁竞争 偏向锁,轻量级锁成功率提高
ConcurrentHashMap
HashMap的同步实现
– Collections.synchronizedMap(Map<K,V> m)– 返回SynchronizedMap对象
public V get(Object key) {
synchronized (mutex) {
return m.get(key);
}
}
public V put(K key, V value) {
synchronized (mutex) {
return m.put(key, value);
}
}
ConcurrentHashMap
– 若干个Segment :Segment<K,V>[] segments
– Segment中维护HashEntry<K,V>
– put操作时
• 先定位到Segment,锁定一个Segment,执行put
在减小锁粒度后, ConcurrentHashMap允许若干个线程同时进入
- 锁分离
根据功能进行锁分离
ReadWriteLock
读多写少的情况,可以提高性能
读锁 |
写锁 | |
读锁 |
可访问 |
不可访问 |
写锁 |
不可访问 |
不可访问 |
读写分离思想可以延伸,只要操作互不影响,锁就可以分离
LinkedBlockingQueue
– 队列
– 链表
A
- 锁粗化
- 锁消除