锁类型
操作系统层面
自旋锁 (消耗cpu)
等待锁
分类
单资源互斥lock
多资源互斥lock (信号量)
管程
为了简化编程,将信号量封装了起来
信号量面向资源数,需要控制获取和释放
管程,面向线程
协作机制
乐观锁
先尝试,认为没有其他在竞争。如果执行失败(有其他人在竞争)。再重试一次。如: CAS 操作
悲观锁
先锁定资源,不管是否有其他人在竞争。 如:synchronized
获取锁的方式
自旋
进入队列等待
优点:不耗cpu
缺点:性能差。需要内核处理线程切换。
java中锁synchronized
锁的状态总共有四种:无锁状态、偏向锁、轻量级锁和重量级锁。随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级的重量级锁(但是锁的升级是单向的,也就是说只能从低到高升级,不会出现锁的降级)。JDK 1.6中引入偏向锁和轻量级锁的,优化synchronized的底层实现