waiter 存放等待的线程,这是一个单链表,没有用 lock 或者 sync 但是实现了线程安全.
static final class WaitNode {
// 记录当前线程.
volatile Thread thread;
// 指向下一个线程.
volatile WaitNode next;
WaitNode() { thread = Thread.currentThread(); }
}
这里为啥会使用 volatile 进行修饰了,而 Treober Stack 中则没有使用 volatile 进行修饰?
我们先看下 Treober Stack:
private static class Node<E> {
public final E item;
public Node<E> next;
public Node(E item) {
this.item = item;
}
}
为什么了?
我觉得在于 removeWaiter 的实现:
private void removeWaiter(WaitNode node) {
if (node != null) {
// 设置节点的线程为空,做删除标记
node.thread = null;
retry:
for (;;) { // restart on removeWaiter race
for (WaitNode pred = null, q = waiters, s; q != null; q = s) {
s = q.next;
// thread不为空,continue
if (q.thread != null)
pred = q;
// thread 为空且 pred 不为空
else if (pred != null) {
// 删除 q
pred.next = s;
// 检查一下 pred 的 thread,如果被其他线程修改,retry outer loop
if (pred.thread == null) // check for race
continue retry;
}
// thread 为空且 pred 为空说明 q 为栈顶,将 q.next设置为栈顶,失败则 retry.
else if (!UNSAFE.compareAndSwapObject(this, waitersOffset,
q, s))
continue retry;
}
break;
}
}
}
这里面使用到了 node.thread = null 和 if(q.thread != null)
在多线程的环境中,如果不使用 volatile 进行修饰的话,一个线程将将 node.thread 赋值为了 null,但是其他线程发现不了这个操作导致发生错误.
分享到:
相关推荐
主要介绍了futuretask源码分析(推荐),小编觉得还是挺不错的,这里给大家分享下,供各位参考。
FutureTask 底层实现分析 FutureTask 是 Java 中的一种非常重要的多线程设计模式,用于异步计算线程之间的结果传递。在 JDK 中,FutureTask 类是 Future 模式的实现,它实现了 Runnable 接口,作为单独的线程运行。...
FutureTask用法及使用场景介绍 FutureTask是一种异步获取执行结果或取消执行任务的机制,它可以用来处理耗时的计算任务,使主线程不需要等待计算结果,而是继续执行其他任务。下面将详细介绍FutureTask的用法和使用...
`FutureTask`是Java并发编程中的一个重要组件,它位于`java.util.concurrent`包下,是`Executor`框架的一部分。这个类结合了`Runnable`或`Callable`接口的特性,并提供了异步执行的能力,同时允许你在任务完成后获取...
在本篇文章中,我们将深入探讨`ThreadPoolTaskExecutor`的配置及其使用,并结合`FutureTask`来讨论异步任务处理。 首先,让我们了解`ThreadPoolTaskExecutor`的基本配置。在Spring中,我们通常通过在配置文件或Java...
三,未来任务源码 FutureTask的七种状态 状态(state) 值 描述 新的 0 任务执行阶段,结果赋值值前 完成中 1个 结果赋值阶段 普通的 2个 任务执行完毕 优秀的 3 任务执行时发生异常 取消 4 任务被取消 中断 5 设置...
Java FutureTask类使用案例解析 Java FutureTask类是一种异步计算的工具,用于执行长时间的任务并获取结果。它实现了Runnable和Future接口,既可以作为一个Runnable对象提交给Executor执行,也可以作为一个Future...
Java中的Runnable、Callable、Future和FutureTask是Java多线程编程中的核心概念,它们各自扮演着不同的角色,共同协作以实现并发任务的管理和执行。 1. **Runnable**: Runnable是最基本的多线程接口,它只有一个`...
三、示例代码分析 在提供的代码示例中,创建了一个ExecutorService,并提交了一个FutureTask。任务是一个模拟1秒CPU空转的Callable。当调用`future.get()`时,主线程会被阻塞,直到任务完成。如果使用`get(long ...
视频讲解: 1,京东APP界面的接口如何正确调用; 2,从并发编程角度来提高系统性能;...4,从Futuretask类源码分析到手写; 5,京东平台如何提升Web项目吞吐量; 6,互联网职业生涯,你问我来答; 7,互动答疑。
Java线程池FutureTask实现原理详解 Java线程池FutureTask实现原理详解是Java多线程编程中的一种重要机制,用于追踪和控制线程池中的任务执行。下面将详细介绍FutureTask的实现原理。 类视图 为了更好地理解...
本文将详细介绍Future和FutureTask的关系、使用和分析。 一、Future介绍 Future位于java.util.concurrent包下,是一个接口,定义了五个方法: 1. `cancel(boolean mayInterruptIfRunning)`: 取消任务,取消成功则...
Java并发包源码分析(JDK1.8):囊括了java.util.concurrent包中大部分类的源码分析,其中涉及automic包,locks包(AbstractQueuedSynchronizer、ReentrantLock、ReentrantReadWriteLock、LockSupport等),queue...
#### 四、FutureTask源码解析 ##### 4.1 Callable接口 `Callable`是一个泛型接口,其泛型`V`指定了`call`方法返回的类型。与`Runnable`接口不同,`Callable`不仅能够执行任务,还能返回计算结果,并且可以抛出异常...
Java中的`Future`和`FutureTask`是并发编程中重要的工具,它们允许程序异步执行任务并获取结果。`Future`接口提供了对异步计算结果的访问和控制,而`FutureTask`是`Future`的一个具体实现,它还同时实现了`Runnable`...
FutureTask<Integer> task3 = new FutureTask(() -> { log.debug("hello"); return 100; }); new Thread(task3, "t3").start(); // 主线程阻塞,等待 task3 执行完毕并获取结果 Integer result = task3.get(); ...
Java并发编程中,`FutureTask`是一个非常关键的组件,它结合了`Runnable`和`Future`接口的能力,使得我们可以在异步执行的任务完成后获取其结果。`FutureTask`不仅是一个可取消的任务,还能报告其执行状态。在这个...
`Future`、`FutureTask`、`Callable`和`Runnable`是Java并发编程中的核心接口和类,它们在Android开发中同样有着广泛的应用。下面将详细介绍这些概念以及它们如何协同工作。 1. `Runnable`: 这是Java中最基础的多...
1. **FutureTask源码分析**:深入理解`FutureTask`的工作原理,包括状态管理、执行流程、取消机制等。 2. **手动实现FutureTask**:尝试自己动手实现一个简易版的`FutureTask`类,加深对其内部机制的理解。 3. **...