Java中有哪些锁

  1. 悲观锁和乐观锁
    • 悲观锁和乐观锁只是一种感念
    • 悲观锁:认为资源一定会发生多线程冲突,所以每次操作都会上锁。
    • 乐观锁:认为资源不会被其他线程所修改,不上锁。使用volatile与CAS机制配合使用,也可以加版本号。
    • 这种概念在mysql数据库中也经常使用,乐观锁:mysql添加一列版本号的字段。
  2. 独享锁和共享锁
    • 独享锁和共享锁只是一种感念
    • 独享锁:只让本线程持有这把锁
    • 共享锁:允许多个线程持有这把锁
    • 如ReentrantReadWriteLock,通过实现AQS的不同实现方法来实现想要的效果
  3. 互斥锁和读写锁
    • 是独享锁和共享锁的具体实现
    • 读写锁的具体实现是ReadWriteLock
  4. 可重入锁
    • 允许一个线程多次获得一把锁
    • 加锁是state + 1,释放锁时state - 1,为0则完全释放锁
    • 也是一种不同的实现AQS方式
  5. 分段锁
    • concurrentHashMap,用Segment分段,默认16段,后优化为每个节点一段
  6. 公平锁和非公平锁
    • 公平锁:来了的线程都去阻塞队列排队
    • 非公平锁:新来的线程有机会去抢夺锁资源,失败则取排队
  7. 偏向锁,轻量级锁和重量级锁
    • synchronized的底层优化
    • 对象头中记录持有线程的id,如果发现是自己线程,就不需要加锁(这是偏向锁)
    • 发现不是自己id,自选等待(这是轻量级锁)
    • 等待失败,或多人竞争。继续锁升级,需要操作系统的Monitor对象进行控制。