// 方法throw折行空4个空格
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException {
s.defaultWriteObject();
s.writeObject(getException());
}
// (ForkJoinTask.class.getDeclaredField("status"))参数折行
static {
exceptionTableLock = new ReentrantLock();
exceptionTableRefQueue = new ReferenceQueue<Object>();
exceptionTable = new ExceptionNode[EXCEPTION_MAP_CAPACITY];
try {
UNSAFE = sun.misc.Unsafe.getUnsafe();
statusOffset = UNSAFE.objectFieldOffset
(ForkJoinTask.class.getDeclaredField("status"));
} catch (Exception e) {
throw new Error(e);
}
}
/**
* Wakes up or creates a worker.
*/
final void signalWork() {
/*
* The while condition is true if: (there is are too few total
* workers OR there is at least one waiter) AND (there are too
* few active workers OR the pool is terminating). The value
* of e distinguishes the remaining cases: zero (no waiters)
* for create, negative if terminating (in which case do
* nothing), else release a waiter. The secondary checks for
* release (non-null array etc) can fail if the pool begins
* terminating after the test, and don't impose any added cost
* because JVMs must perform null and bounds checks anyway.
*/
long c; int e, u;
while ((((e = (int)(c = ctl)) | (u = (int)(c >>> 32))) &
(INT_SIGN|SHORT_SIGN)) == (INT_SIGN|SHORT_SIGN) && e >= 0) {
if (e > 0) { // release a waiting worker
int i; ForkJoinWorkerThread w; ForkJoinWorkerThread[] ws;
if ((ws = workers) == null ||
(i = ~e & SMASK) >= ws.length ||
(w = ws[i]) == null)
break;
long nc = (((long)(w.nextWait & E_MASK)) |
((long)(u + UAC_UNIT) << 32));
if (w.eventCount == e &&
UNSAFE.compareAndSwapLong(this, ctlOffset, c, nc)) {
w.eventCount = (e + EC_UNIT) & E_MASK;
if (w.parked)
UNSAFE.unpark(w);
break;
}
}
else if (UNSAFE.compareAndSwapLong
(this, ctlOffset, c,
(long)(((u + UTC_UNIT) & UTC_MASK) |
((u + UAC_UNIT) & UAC_MASK)) << 32)) {
addWorker();
break;
}
}
}
private boolean tryReleaseWaiter() {
long c; int e, i; ForkJoinWorkerThread w; ForkJoinWorkerThread[] ws;
if ((e = (int)(c = ctl)) > 0 &&
(int)(c >> AC_SHIFT) < 0 &&
(ws = workers) != null &&
(i = ~e & SMASK) < ws.length &&
(w = ws[i]) != null) {
long nc = ((long)(w.nextWait & E_MASK) |
((c + AC_UNIT) & (AC_MASK|TC_MASK)));
if (w.eventCount != e ||
!UNSAFE.compareAndSwapLong(this, ctlOffset, c, nc))
return false;
w.eventCount = (e + EC_UNIT) & E_MASK;
if (w.parked)
UNSAFE.unpark(w);
}
return true;
}
final int idlePerActive() {
// Approximate at powers of two for small values, saturate past 4
int p = parallelism;
int a = p + (int)(ctl >> AC_SHIFT);
return (a > (p >>>= 1) ? 0 :
a > (p >>>= 1) ? 1 :
a > (p >>>= 1) ? 2 :
a > (p >>>= 1) ? 4 :
8);
}
/**
* Final callback from terminating worker. Removes record of
* worker from array, and adjusts counts. If pool is shutting
* down, tries to complete termination.
*
* @param w the worker
*/
final void deregisterWorker(ForkJoinWorkerThread w, Throwable ex) {
int idx = w.poolIndex;
int sc = w.stealCount;
int steps = 0;
// Remove from array, adjust worker counts and collect steal count.
// We can intermix failed removes or adjusts with steal updates
do {
long s, c;
int g;
if (steps == 0 && ((g = scanGuard) & SG_UNIT) == 0 &&
UNSAFE.compareAndSwapInt(this, scanGuardOffset,
g, g |= SG_UNIT)) {
ForkJoinWorkerThread[] ws = workers;
if (ws != null && idx >= 0 &&
idx < ws.length && ws[idx] == w)
ws[idx] = null; // verify
nextWorkerIndex = idx;
scanGuard = g + SG_UNIT;
steps = 1;
}
if (steps == 1 &&
UNSAFE.compareAndSwapLong(this, ctlOffset, c = ctl,
(((c - AC_UNIT) & AC_MASK) |
((c - TC_UNIT) & TC_MASK) |
(c & ~(AC_MASK|TC_MASK)))))
steps = 2;
if (sc != 0 &&
UNSAFE.compareAndSwapLong(this, stealCountOffset,
s = stealCount, s + sc))
sc = 0;
} while (steps != 2 || sc != 0);
if (!tryTerminate(false)) {
if (ex != null) // possibly replace if died abnormally
signalWork();
else
tryReleaseWaiter();
}
}
public final Throwable getException() {
int s = status;
return ((s >= NORMAL) ? null :
(s == CANCELLED) ? new CancellationException() :
getThrowableException());
}
public static ForkJoinPool getPool() {
Thread t = Thread.currentThread();
return (t instanceof ForkJoinWorkerThread) ?
((ForkJoinWorkerThread) t).pool : null;
}
public boolean tryUnfork() {
return ((ForkJoinWorkerThread) Thread.currentThread())
.unpushTask(this);
}
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
private static final long SHRINK_RATE =
4L * 1000L * 1000L * 1000L; // 4 seconds
boolean casNext(SNode cmp, SNode val) {
return cmp == next &&
UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val);
}
分享到:
相关推荐
《阿里巴巴Java代码规范》是Java开发者们遵循的一套专业编程指南,旨在提高代码质量、可读性和维护性。这份规范由阿里巴巴集团内部的专家团队制定,经过多年的实践和完善,已经成为业界广泛参考的标准之一。以下是对...
### Java代码规范详解 #### 一、前言 1. **为什么使用代码规范** - 软件的生命周期中,大约80%的成本都花费在维护上。因此,为了提高软件的可维护性和可读性,代码规范显得尤为重要。 - 维护通常不是由最初的...
阿里推的这个Java代码规范插件,名为P3C(Alibaba Java Coding Guidelines Plug-in),是基于Eclipse和IntelliJ IDEA开发的,旨在帮助开发者遵循阿里巴巴内部制定的一套严谨的Java编程规范。该规范旨在提升代码质量...
Java代码规范针对Android开发的规定相当细致,涉及到代码排版、注释、标识符命名以及代码的可读性等方面,旨在确保代码的整洁性、一致性和可维护性。以下是根据给定文件信息,详细解读的Java代码规范知识点。 首先...
Java代码规范是编程实践中非常重要的一个方面,它不仅有助于提高代码的可读性和可维护性,还能提升团队协作效率。以下是一些关于Java代码规范的关键点: 1. **版权信息**:每个Java文件的开头都应该包含版权信息,...
本文档是根据Java编程语言的官方指导,结合SUM公司的实践经验和标准制定的JAVA代码规范。这份规范旨在提升团队协作效率,减少误解,提高代码质量。 1. 引言 1.1 为什么要有代码规范 代码规范的重要性在于,它能够...
代码规范比比皆是,但是很少有公司做好代码规范的。忍不住想谈谈代码规范的重要性,希望所有人都能够重视起来。而且,我相信,如果我们代码规范能够做好的话,且不说开发水平提高多少,至少我们也会有很多出色开源...
首先,让我们了解阿里巴巴Java代码规范。阿里巴巴作为中国领先的互联网公司,其开发团队制定了一套详细的Java编程规范——《Alibaba Java Coding Guidelines》。这套规范涵盖了命名规则、注释规范、异常处理、并发...
下面将详细讨论JSP和Java代码规范的一些关键要点。 ### JSP代码规范 1. **注释**:为每个JSP页面添加注释,包括作者、创建日期、更新日期以及页面功能描述,以便于后续维护。 2. **结构清晰**:避免过多的脚本...
【Java代码规范】是开发团队为了确保代码质量、提高代码可读性和可维护性而制定的一套编程标准。编码规范的遵循对于软件的生命周期至关重要,因为大部分时间和成本都花在了代码的维护上,而代码通常由不同的人接手...
Java语言编码规范是软件开发中的重要组成部分,它旨在提高代码的可读性、可维护性和团队协作效率。遵循良好的编码规范能确保代码的一致性,降低...通过不断学习和实践,开发者可以写出更加高效、可读性强的Java代码。
该插件旨在帮助开发者遵循阿里巴巴制定的Java编码规范,提升代码质量和可读性,从而提高团队协作效率。下面将详细解释这款插件的功能、使用方法以及其对开发工作的重要性。 首先,了解阿里巴巴的Java编码规范至关...
首先,让我们深入了解一下Java代码规范。Java规范通常包括命名规则、注释规范、类与对象设计、异常处理、并发编程等多个方面。阿里巴巴的Java代码规范强调了以下几点: 1. **命名规范**:变量、方法、类名应使用有...
### Java代码规范详解 #### 一、引言 在软件开发过程中,代码规范的重要性不言而喻。良好的代码规范不仅能提高代码的可读性和可维护性,还能促进团队成员之间的协作与沟通。本文将详细介绍《Java代码规范》文档中...
《阿里巴巴Java编程规范》是阿里巴巴官方团队为了提升Java开发者代码质量与一致性,降低维护成本而制定的一套详尽的编程指南。这份规范不仅对新手有很好的引导作用,也为经验丰富的开发者提供了良好的编码习惯建议,...
【Java代码书写规范】 在Java编程中,代码的书写规范是非常重要的,它有助于提高代码的可读性,便于团队协作和后期维护。以下是一些关键的命名规则和书写规范: 1. **命名规则**: - **通用规则**:所有命名应该...
考虑到现代软件开发过程中,维护阶段通常占据了80%的工作量,并且维护者往往不是最初的开发者,因此代码规范的制定与遵循显得尤为重要。尽管一些程序员可能认为这些规范限制了个人风格,但在团队合作中,统一的规范...