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