Java并发之FairSync和NonfairSync
来源:互联网 发布:田岛绣花软件 编辑:程序博客网 时间:2024/06/08 15:22
Java并发中的fairSync和NonfairSync主要区别为:
如果当前线程不是锁的占有者,则NonfairSync并不判断是否有等待队列,直接使用compareAndSwap去进行锁的占用;
如果当前线程不是锁的占有者,则FairSync则会判断当前是否有等待队列,如果有则将自己加到等待队列尾;
对应的源码如下:
FairSync (注意FairSync和NonFairSync均继承自AbstractQueuedSynchronizer):
protected final boolean tryAcquire(int acquires) {final Thread current = Thread.currentThread();int c = getState();
if (c == 0) {//判断是否有等待队列,没有队列时,进行占用,如果占用失败,将自己加到等待队列尾if(!hasQueuedPredecessors() &&}
compareAndSetState(0, acquires)) {
return true;setExclusiveOwnerThread(current);compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
}else if (current == getExclusiveOwnerThread()) {
int nextc = c + acquires;
if (nextc < 0)throw new Error("Maximum lock count exceeded");
setState(nextc);return true;
}return false;
};NonFairSync:final boolean nonfairTryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) {//不判断是否有等待队列,直接进行占用,如果占用失败也进到等待队列尾 if (compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc < 0) // overflow throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false;}占用失败后,将自己加到等待队列尾的动作在AbstractQueuedSynchronizerder类acquire方法中:
public final void acquire(int arg) { if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) selfInterrupt();}由于FairSync和NonFairSync均继承AbstractQueuedSynchronizerder(AQS),这里使用了到了一个设计模式(模板模式)来设计NonFairSync和FairSync类
阅读全文
0 0
- Java并发之FairSync和NonfairSync
- [java并发]读写锁ReentrantReadWriteLock里面的FairSync 和 NonfairSync
- FairSync与NonFairSync比较
- FairSync与NonfairSync
- java 并发之Callable和Future
- 【Java之并发】ReentrantLock和synchronized区别
- Java并发之ThreadPoolExecutor和FutureTask
- Java并发之CountDownLatch、CyclicBarrier和Semaphore
- Java基础之---并发(Concurrency)和多线程
- java并发编程之进程和线程
- 【Java并发编程】之synchronized和Lock
- Java 并发之 CountDownLatch、CyclicBarrier 和 Semaphore
- Java 并发之 CountDownLatch、CyclicBarrier 和 Semaphore
- Java 并发之 CountDownLatch、CyclicBarrier 和 Semaphore
- Java并发之CountDownLatch、CyclicBarrier和Semaphore
- Java并发之CountDownLatch、CyclicBarrier和Semaphore
- java多线程之并行和并发
- Java并发之ThreadLocal和InheritableThreadLoacal
- Linux下的eval、`与$()
- springmvc Controller使用工具类完成上传图片到阿里云
- keil_5编译C程序时出现“P1 undefined identifier“错误
- 如何让git小乌龟工具记住Git账号密码 免多次登录
- 1003: [ZJOI2006]物流运输 最短路+dp
- Java并发之FairSync和NonfairSync
- 代码 示例 让每个方法尽量粒度小点
- 03-指令ng-bind
- 【git】git一般操作流程
- XRecyclerView的使用
- 暑假兴趣小组实训
- 【JAVA300】6-10 笔记
- html笔记——设置动态宽度的div为正方形
- LeetCode--Generate Parentheses