1.减少锁持有时间
2.减小锁的粒度 (尽可能的细化业务代码,业务方法,在需要加锁的方法上进行加锁)
3.锁分离(读写锁) 参考LinkedBlockingQueue take(),put()
4.锁粗化(和减少锁持有时间相反,主要针对很快能执行完成的操作)
锁优化
偏向锁:一个线程获得了锁,那么锁就进入偏向模式。当这个线程再次请求锁时,无须在做任何同步操作,节省了锁申请的操作。(几乎没有锁竞争场合,偏向锁有比较好的优化 java虚拟机参数 -XX:+UseBiasedLocking 开启偏向锁)。
轻量级锁:如果偏向锁失败,虚拟机不会立即挂起线程。对象头部作为指针,指向持有锁的线程堆栈的内部判断一个线程是否持有对象锁。如果获取不到就会膨胀为重量级锁。
自旋锁:轻量级锁获取失败后,虚拟机会让当前线程做几个空循环(自旋),经过若干次循环后,可以得到锁,就顺利进入临界区,如果得不到就线程挂起。
锁消除:去除不可能存在共享资源竞争的锁。如下:
Vector 为createStrings函数的局部变量,不存在被其他线程访问。(锁消除涉及逃逸分析,观察变量是否逃出某一个作用域 -server 模式下进行 逃逸分析 -XX:+DoEscapeAnalysis打开逃逸分析;-XX:+EliminateLocks 打开锁消除)