今天心情:我是一个程序员,现在已经走向了逼不得已通过写文章赚取流量来谋生的道路。可是现在流量惨淡,可是我并不惊慌。奥里给。
详细内容链接地址: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;
}