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