synchronized 底层实现和运行原理(面试)
Lock的实现步骤
1.创建Lock lock = new ReentrantLock([true]);
2.加锁Lock.lock()
3.释放锁lock.unlock();
创建锁的时候可以指定参数 ,默认情况下创建性能更高的非公平锁,使用参数true创建公平锁
lock的使用注意事项:
1.unlock一定要放在finally里面,如果没有反到finally中,可能导致锁资源不释放,永久占用的问题
2.lock()一定要放在try的首行;可以避免没有锁却执行释放锁的操作,以及释放锁的错误信息会覆盖业务报错信息,增加调试程序修复程序的复杂度。
synchronized VS Lock(ReentrantLock):面试题
1.Lock更灵活,拥有更多方法,比如tryLock()
2.锁的类型不同,Lock默认是非公平锁,但是可以指定为公平锁
synchronized只能是非公平锁
3.synchronized是JVM层面提供的锁,自动加锁和释放锁,对于开发者无感
Lock手动进行加锁释放锁
4.synchronized可以修饰方法(静态的、普通的)和代码块
Lock只能修饰代码
5.调用Lock 和 synchronized 线程是锁的状态不同
lock方法变成waiting
synchronized会变成blocked