1、注意隐式的锁竞争
隐式的锁竞争,可能会造成意外的死锁,如HashMapA.putAll(HashMapB),如果HashMapB是synchronized封装的,此处隐式的HashMapB.size()
会竞争HashMap,可能造成死锁。
2、尽量使用明锁
明锁即reentrantLock,Object等显式调用的锁,或者用synchronized标记的函数/代码块
3、尽量避免对Synchronized的collection对象并发的遍历
4、较复杂的锁引用关联,建议绘制锁关系图进行分析
所谓锁关系图,即各个线程之间,通过锁建立的联系。
可以通过查找引用的方式绘制此图。
隐式的锁竞争,可能会造成意外的死锁,如HashMapA.putAll(HashMapB),如果HashMapB是synchronized封装的,此处隐式的HashMapB.size()
会竞争HashMap,可能造成死锁。
2、尽量使用明锁
明锁即reentrantLock,Object等显式调用的锁,或者用synchronized标记的函数/代码块
3、尽量避免对Synchronized的collection对象并发的遍历
4、较复杂的锁引用关联,建议绘制锁关系图进行分析
所谓锁关系图,即各个线程之间,通过锁建立的联系。
可以通过查找引用的方式绘制此图。