synchronized和lock的区别
本文作者:FUNKYE(陈健斌),杭州某互联网公司主程。
定义
类别 | synchronized | lock |
---|---|---|
实现方式 | jvm底层队列监控实现 | 一个类,由jdk代码实现 |
释放锁 | 1.锁方法块代码执行完,系统自动释放锁 2.出现异常释放 | 1.必须在finally中释放锁 2.利用代码中lockInterruptibly来中断锁. |
锁状态 | 无法获取 | 可以trylock来判断锁目前的状态 |
获取锁方式 | A线程如果一直占用,B就只能等待 | 可以尝试获取锁,线程也可以不需要一直等待下去 |
类型 | 非公平锁 | 默认非公平锁,可设置公平锁 |
使用方式 | 方法上,代码块,编程简单 | 代码块,配合try finally使用,灵活度高 |
性能 | 竞争小情况下,性能更好,而且会更具竞争情况自动从偏向锁–>轻量级锁–>重量级锁升级 | 竞争激烈情况下,lock性能更加出众 |
Lock支持的功能:
解决方法有2种:
1.支持公平锁
2.可中断锁,利用lockInterruptibly的方法可中断锁.
3.快速反馈锁,利用trylock/trylock(tryTimes)来避免遇到死锁等情况的发生
4.读写锁的功能,保证写的时候是独占,读的时候允许并发.
5.可利用Condition来精准控制多个线程,比如:A开始下单,B开始上架,利用lock.newCondition()来得到自己需要休眠或启动的条件.B上架10个,调用A的条件await挂起线程唤醒B线程,此时B线程去下单,下单到没有货的时候,再把对应条件await,唤醒A线程.
synchronized+volatile的帮助
1.synchronized存在阻塞和性能问题,而volatile并不是锁,所以不存在前面的问题.
2.volatile借助了内存屏障,保证了可见性跟有序性,禁止了重排序的功能,防止出现脏读的情况.
JDK1.5之后对synchronized的优化
锁的实现引入了大量的优化,如自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术来减少锁操作的开销。