现在测试不同线程下的表现(时间单位ms):
1 | 10 | 50 | 100 | 500 | 1000 | 5000 | |
synchronized | 542 | 4894 | 4667 | 4700 | 5151 | 5156 | 5178 |
lock | 838 | 1211 | 821 | 847 | 851 | 1211 | 1241 |
可以看到,在多线程环境并存在大量竞争的情况下,synchronized的用时迅速上升,而lock却依然保存不变或增加很少。
Lock是用CAS来实现的
JDK 1.6以上synchronized也改用CAS来实现了,所以两者性能差不多
Lock提供的功能丰富点,synchronized的使用简单点
1、特色:reentainLock 可以维持公平性、响应中断、超时机制
2、性能:并发不严重sync更优,高并发reentainLock好。
3、底层实现:sync和lock 有同步队列、也有等待队列,sync是基于 object 的wait/notify,lock 是基于condition的await/sigal,底层是locksupport.park/unpark。
4、synchronized 和 lock 在高并发下 ,lock 更优秀。 原因在哪里?
1)行为划分
2)代码实现细节上的调优
3) 资源粒度的划分