用户工具


锁类型

操作系统层面

  • 自旋锁 (消耗cpu)
  • 等待锁
    • 分类
      • 单资源互斥lock
      • 多资源互斥lock (信号量)
      • 管程
        • 为了简化编程,将信号量封装了起来
          • 信号量面向资源数,需要控制获取和释放
          • 管程,面向线程
    • 协作机制
      • 多线程竞争资源
      • 只有一个线程获取资源,其他线程挂起到等待队列
      • 当前线程释放资源后,从队列中通知其他线程 (公平通知,非公平通知)

乐观锁

先尝试,认为没有其他在竞争。如果执行失败(有其他人在竞争)。再重试一次。如: CAS 操作

悲观锁

先锁定资源,不管是否有其他人在竞争。 如:synchronized

获取锁的方式

自旋

  • 优点:竞争小的情况下性能好
  • 缺点:耗费cpu

进入队列等待

  • 优点:不耗cpu
  • 缺点:性能差。需要内核处理线程切换。

java中锁synchronized

锁的状态总共有四种:无锁状态、偏向锁、轻量级锁和重量级锁。随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级的重量级锁(但是锁的升级是单向的,也就是说只能从低到高升级,不会出现锁的降级)。JDK 1.6中引入偏向锁和轻量级锁的,优化synchronized的底层实现