• 可重入锁:指的是线程可以重复获取同一把锁。即同一个线程在外层方法获取了锁,在进 入内层方法会自动获取锁,可以一定程度避免死锁

  • 公平锁:多线程按照申请锁的顺序来获取锁

  • 非公平锁:多线程不按照申请锁的顺序来获取锁。这就可能会出现优先级反转(后来者居 上)或者饥饿现象(某线程总是抢不过别的线程,导致始终无法执行)

  • 独享锁:只能被一个线程同时持有

  • 共享锁:可以被多个线程持有。比如 ReentrantReadWriteLock 的写锁是独享的而读锁是 共享的,使得并发读操作非常高效

  • 悲观锁:对于并发采取悲观的态度,认为不加锁的并发操作一定会出问题。悲观锁适合写 操作频繁的场景

  • 乐观锁:乐观锁对于并发采取乐观的态度,认为不加锁的并发操作也没什么问题。对于同 一个数据的并发操作,是不会发生修改的。在更新数据的时候,会采用不断尝试更新的方 式更新数据。乐观锁适合读多写少的场景

  • 偏向锁:偏向锁是指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁,降 低获取锁的代价

  • 轻量级锁:是指当锁是偏向锁的时候,被另一个线程所访问,偏向锁就会升级为轻量级锁, 其他线程会通过自旋的形式(进行无意义的循环)尝试获取锁,不会阻塞,提高性能

  • 重量级锁:是指当锁为轻量级锁的时候,另一个线程虽然是自旋,但自旋不会一直持续下 去,当自旋一定次数的时候,还没有获取到锁,就会进入阻塞,该锁膨胀为重量级锁。重 量级锁会让其他申请的线程进入阻塞,性能降低