公平锁,非公平锁,乐观锁,悲观锁

公平锁/非公平锁(多线程执行顺序的维度)

概念理解

  • 公平锁:加锁前先查看是否有排队等待的线程,有的话优先处理排在前面的线程,先来先得
  • 非公平所:线程加锁时直接尝试获取锁,获取不到就自动到队尾等待。

例子

  • ReentrantLock 同时支持两种锁
//建立一个非公平锁,默认是非公平锁

Lock nonFairLock= new ReentrantLock();

Lock nonFairLock= new ReentrantLock(false);

//建立一个公平锁,构造传参true

Lock fairLock= new ReentrantLock(true);

适用场景

  • 更多的是直接使用非公平锁:非公平锁比公平锁性能高5-10倍,由于公平锁须要在多核状况下维护一个队列,若是当前线程不是队列的第一个没法获取锁,增长了线程切换次数。

 

乐观锁/悲观锁(多线程操做共享数据的维度)

概念理解

  • 悲观锁:假设必定会发生并发冲突,经过阻塞其余全部线程来保证数据的完整性。
  • 乐观锁:假设不会发生并发冲突,直接不加锁去完成某项更新,若是冲突就返回失败。

例子

  • 悲观锁:Synchronized多线程同步,具备排他性,也会容易产生死锁。
  • 乐观锁:CAS机制,简单来讲会有三个操做数,当前内存变量值V,变量预期值A,即将更新值B,当须要更新变量的时候,会直接将变量值V和预期值A进行比较,若是相同,则直接更新为B;若是不相同,则当前变量值V刷新到预期值中,而后从新尝试比较更新。

适用场景

  • 乐观锁:适用于数据争用不严重/重试代价不大/须要相应速度快的场景。
  • 悲观锁:适用于数据争用严重/重试代价大的场景。
相关文章
相关标签/搜索