乐观锁、悲观锁和公平、非公平

本文深入探讨了乐观锁和悲观锁的概念,并通过Java代码展示了公平锁与非公平锁的实现。公平锁会检查当前线程是否为队列的第一个,而非公平锁则不作此判断,直接尝试获取锁。文章通过具体示例解释了这两种锁策略的工作原理及其在并发控制中的应用。
摘要由CSDN通过智能技术生成

今天心情:我是一个程序员,现在已经走向了逼不得已通过写文章赚取流量来谋生的道路。可是现在流量惨淡,可是我并不惊慌。奥里给。

详细内容链接地址:https://zhuanlan.zhihu.com/p/345989476

如果内容有错误或者您有不同的见解,请关注我。想要思维导图的小伙伴们记得留言哦。

乐观锁:获取不到锁,我就自旋,自旋就是while true,直到获取到锁为止。

悲观锁:获取不到锁,我就不要了。等着。

公平:判断当前线程是是否第一个线程(就是我等的时间久了,因为第一个是最先放进队列的),如果不是,就等着。如果是,就执行。

非公平:谁抢占了,算谁的。与公平的区别就在于,我不判断你是否是队列中的第一个。

在代码实现上:主要是调用hasQueuedPredecessors()判断当前线程是否是队列的头(公平的就判断是否是第一个线程或者为空。不公平的就不判断),然后如果获取不到锁,我是采用等待还是while(true)再尝试一下呢?

(如果让当前线程等待,他就是悲观的,不思进取的。如果是while(true)(自旋),他就是乐观的,积极向上的,心态比较好。)

/** 公平:
  * Sync object for fair locks
  * Acquires only if thread is first waiter or empty
  * 只有当线程是空或者是队列中的第一个的时候才会获取到锁。hasQueuedPredecessors
  */
  protected final boolean tryAcquire(int acquires) {
      if (getState() == 0 && !hasQueuedPredecessors() &&
          compareAndSetState(0, acquires)) {
          setExclusiveOwnerThread(Thread.currentThread());
      return true;
      }
      return false;
  }

/** 不公平:
  * Acquire for non-reentrant cases after initialTryLock prescreen
  * 新来的线程随便谁都可以获取锁,无论你是不是队列中的第一个。区别:没有hasQueuedPredecessors方法
  */
  protected final boolean tryAcquire(int acquires) {
  if (getState() == 0 && compareAndSetState(0, acquires)) {
      setExclusiveOwnerThread(Thread.currentThread());
      return true;
      }
      return false;
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值