synchronized 关键字底层做了哪些优化
JDK1.6后synchronize引入了,偏向锁,轻量锁,自旋锁,锁消除,锁粗化等技术为了减少锁的操作开销
锁有四种状态,他们会随着竞争越激烈而升级,锁只能升级不会降级,提高对获得锁和释放锁的效果
1:无锁状态
2:偏向锁状态
3:自旋锁状态
4:重量级锁状态
synchronized和ReentrantLock区别是什么?
synchronize和ReentrantLock都是可重入锁,就是只要对象没有释放锁还是可以获取对象的
synchronize是JVM层面的,ReentrantLock是JDK层面的
synchronize和ReentrantLock控制等待和唤醒也是不同的,synchronize需要调用wait方法进入等待状态,需要其他线程调用notify和notifyall方法才能唤醒,ReentrantLock进入等待状态要调用await方法,唤醒要调用signal和signalAll方法
synchronize在竞争资源时会一直等待,ReentrantLock可以尝试获取锁,并得到获取结果
synchronize加锁代码在执行完任务或则出现异常后会释放锁,ReentrantLock不会释放锁,需要在finally代码块显示释放
synchronize是无法实现公平锁的,ReentrantLock可以满足公平锁的