概念

  • 无锁
  • 偏向锁
  • 轻度锁
  • 重度锁

偏向锁

轻度锁

重度锁

分类

公平锁/ 非公平锁

  • 公平锁:先来后到
  • 非公平锁:允许插队

Lock锁

实现类:

  • ReentrantLock:默认是非公平锁
  • ReadLock
  • WriteLock

使用方法

  1. Lock lock = new ReentrantLock();
  2. public void sale(){
  3. lock.lock();
  4. try {
  5. // 业务代码
  6. } catch (Exception e) {
  7. e.printStackTrace();
  8. } finally {
  9. lock.unlock();
  10. }
  11. }

Synchronized和Lock的区别

  1. Synchronized是关键字,Lock是java类
  2. Synchronized无法判断获取锁的状态,Lock锁可以判断释放获取到了锁
  3. Synchronized会自动释放锁,Lock必须手动释放锁,不释放会死锁
  4. Synchronized 线程1 (获得锁,阻塞)、线程2(等待,一直等待);Lock锁不一定会一直等待
  5. Synchronized 可重入锁,不可以中断,非公平锁;Lock可重入锁,可以判断锁,非公平(可以自己设置
  6. Synchronized 适合锁少了的代码同步问题,Lock适合锁大量的同步代码