synchronized 和 Lock区别,用Lock的好处
- 原始构成
- synchronized 是关键字 属于JVM层面,通过javap命令 能看到底层使用 monitorenter 和 monitorexit 控制
- lock 是juc包中的类,是api层面的锁
- 使用方法
- synchronized 不需要用户手动释放锁,当sync代码执行完成后系统会自动让线程释放对锁的占用
- ReentrantLock 需要手动释放锁,如果没有手动释放 会造成死锁现象,需要 lock() 和 unlock() 配合 try/finally语句块完成
- 等待(阻塞)是否可中断
- sync不可中断,只能通过抛出异常或正常运行完毕结束锁占用
- lock 可中断:
1.设置超时方法tryLock(long timeout, TimeUnit unit)
2.线程通过lock.lockInterruptibly()
获取锁,等待中调用interrupt()
方法中断等待
- 加锁是否公平
- sync 非公平锁
- Reent…都可以,默认非公平锁,构造方法中传boolean值,true未公平锁,false未非公平锁
- 锁绑定多个条件Condition
- sync没有,只能随机唤醒一个线程或唤醒全部线程
- Reent…可以实现分组唤醒需要被唤醒的线程,精确唤醒