java中SynchronousQueue的公平和非公平同步队列


本篇内容主要讲解“java中SynchronousQueue的公平和非公平同步队列”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java中SynchronousQueue的公平和非公平同步队列”吧!SynchronousQueue 分为公平和非公平同步队列
构造方法中传入true,表示公平队列这时选择通过TransferQueue中的方法实现出入元素FIFO
否则传入false,使用TransferStack实现出入元素,没有固定顺序TransfererStack中的节点组成
static final class SNode{
volatile SNode next;
volatile SNode match;
volatile Thread waiter;
Object item;
int mode; volatile SNode head;
}
static {
try {
UNSAFE = sun.misc.Unsafe.getUnsafe();
Class> k = SNode.class;
matchOffset = UNSAFE.objectFieldOffset
(k.getDeclaredField(“match”));
nextOffset = UNSAFE.objectFieldOffset
(k.getDeclaredField(“next”));
} catch (Exception e) {
throw new Error(e);
}
}对 transfer方法的实现
E transfer(E e, boolean timed, long nanos) {
/*
* Basic algorithm is to loop trying one of three actions:
*
* 1. If apparently empty or already containing nodes of same
* mode, try to push node on stack and wait for a match,
* returning it, or null if cancelled.
*
* 2. If apparently containing node of complementary mode,
* try to push a fulfilling node on to stack, match
* with corresponding waiting node, pop both from
* stack, and return matched item. The matching or
* unlinking might not actually be necessary because of
* other threads performing action 3:
*
* 3. If top of stack already holds another fulfilling node,
* help it out by doing its match and/or pop
* operations, and then continue. The code for helping
* is essentially the same as for fulfilling, except
* that it doesn’t return the item.
*/ SNode s = null; // constructed/reused as needed
int mode = (e == null) ? REQUEST : DATA; for (;;) {
SNode h = head;
if (h == null || h.mode == mode) { // empty or same-mode
if (timed && nanos if (h != null && h.isCancelled())
casHead(h, h.next); // pop cancelled node
else
return null;
} else if (casHead(h, s = snode(s, e, h, mode))) {
SNode m = awaitFulfill(s, timed, nanos);
if (m == s) { // wait was cancelled
clean(s);
return null;
}
if ((h = head) != null && h.next == s)
casHead(h, s.next); // help s’s fulfiller
return (E) ((mode == REQUEST) ? m.item : s.item);
}
} else if (!isFulfilling(h.mode)) { // try to fulfill
if (h.isCancelled()) // already cancelled
casHead(h, h.next); // pop and retry
else if (casHead(h, s=snode(s, e, h, FULFILLING|mode))) {
香港云主机 for (;;) { // loop until matched or waiters disappear
SNode m = s.next; // m is s’s match
if (m == null) { // all waiters are gone
casHead(s, null); // pop fulfill node
s = null; // use new node next time
break; // restart main loop
}
SNode mn = m.next;
if (m.tryMatch(s)) {
casHead(s, mn); // pop both s and m
return (E) ((mode == REQUEST) ? m.item : s.item);
} else // lost match
s.casNext(m, mn); // help unlink
}
}
} else { // help a fulfiller
SNode m = h.next; // m is h’s match
if (m == null) // waiter is gone
casHead(h, null); // pop fulfilling node
else {
SNode mn = m.next;
if (m.tryMatch(h)) // help match
casHead(h, mn); // pop both h and m
else // lost match
h.casNext(m, mn); // help unlink
}
}
}
}
TransferQueue中的节点组成 static final class QNode{
volatile QNode next;
volatile Object item;
volatile Thread waiter;
final boolean isData;
transient volatile QNode head;
transient volatile QNode tail; }到此,相信大家对“java中SynchronousQueue的公平和非公平同步队列”有了更深的了解,不妨来实际操作一番吧!这里是开发云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

相关推荐: linux中有哪些常用的挂载命令

linux中有哪些常用的挂载命令,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一.mount的命令格式是(注意mount只能在root权限下运行)dervice是要挂载的设备,dir是挂载点二…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 07/27 21:26
下一篇 07/27 21:26

相关推荐