`

FutureTask WaitNode 源码分析

阅读更多
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,但是其他线程发现不了这个操作导致发生错误.

0
0
分享到:
评论

相关推荐

    futuretask源码分析(推荐)

    主要介绍了futuretask源码分析(推荐),小编觉得还是挺不错的,这里给大家分享下,供各位参考。

    FutureTask底层实现分析,有了FutureTask主线程要想获得工作线程(异步计算线程)的结果变得比较简单

    FutureTask 底层实现分析 FutureTask 是 Java 中的一种非常重要的多线程设计模式,用于异步计算线程之间的结果传递。在 JDK 中,FutureTask 类是 Future 模式的实现,它实现了 Runnable 接口,作为单独的线程运行。...

    futuretask用法及使用场景介绍

    FutureTask用法及使用场景介绍 FutureTask是一种异步获取执行结果或取消执行任务的机制,它可以用来处理耗时的计算任务,使主线程不需要等待计算结果,而是继续执行其他任务。下面将详细介绍FutureTask的用法和使用...

    FutureTask学习

    `FutureTask`是Java并发编程中的一个重要组件,它位于`java.util.concurrent`包下,是`Executor`框架的一部分。这个类结合了`Runnable`或`Callable`接口的特性,并提供了异步执行的能力,同时允许你在任务完成后获取...

    spring线程池ThreadPoolExecutor配置以及FutureTask的使用

    在本篇文章中,我们将深入探讨`ThreadPoolTaskExecutor`的配置及其使用,并结合`FutureTask`来讨论异步任务处理。 首先,让我们了解`ThreadPoolTaskExecutor`的基本配置。在Spring中,我们通常通过在配置文件或Java...

    FutureTask:FutureTask原始解析与重组-源码解析

    三,未来任务源码 FutureTask的七种状态 状态(state) 值 描述 新的 0 任务执行阶段,结果赋值值前 完成中 1个 结果赋值阶段 普通的 2个 任务执行完毕 优秀的 3 任务执行时发生异常 取消 4 任务被取消 中断 5 设置...

    Java FutureTask类使用案例解析

    Java FutureTask类使用案例解析 Java FutureTask类是一种异步计算的工具,用于执行长时间的任务并获取结果。它实现了Runnable和Future接口,既可以作为一个Runnable对象提交给Executor执行,也可以作为一个Future...

    Java中的Runnable,Callable,Future,FutureTask的比较

    Java中的Runnable、Callable、Future和FutureTask是Java多线程编程中的核心概念,它们各自扮演着不同的角色,共同协作以实现并发任务的管理和执行。 1. **Runnable**: Runnable是最基本的多线程接口,它只有一个`...

    揭密FutureTask.docx

    三、示例代码分析 在提供的代码示例中,创建了一个ExecutorService,并提交了一个FutureTask。任务是一个模拟1秒CPU空转的Callable。当调用`future.get()`时,主线程会被阻塞,直到任务完成。如果使用`get(long ...

    每秒22W笔订单交易,T5大师直击京东平台性能调优

    视频讲解: 1,京东APP界面的接口如何正确调用; 2,从并发编程角度来提高系统性能;...4,从Futuretask类源码分析到手写; 5,京东平台如何提升Web项目吞吐量; 6,互联网职业生涯,你问我来答; 7,互动答疑。

    Java线程池FutureTask实现原理详解

    Java线程池FutureTask实现原理详解 Java线程池FutureTask实现原理详解是Java多线程编程中的一种重要机制,用于追踪和控制线程池中的任务执行。下面将详细介绍FutureTask的实现原理。 类视图 为了更好地理解...

    比较java中Future与FutureTask之间的关系

    本文将详细介绍Future和FutureTask的关系、使用和分析。 一、Future介绍 Future位于java.util.concurrent包下,是一个接口,定义了五个方法: 1. `cancel(boolean mayInterruptIfRunning)`: 取消任务,取消成功则...

    Java并发包源码分析(JDK1.8)

    Java并发包源码分析(JDK1.8):囊括了java.util.concurrent包中大部分类的源码分析,其中涉及automic包,locks包(AbstractQueuedSynchronizer、ReentrantLock、ReentrantReadWriteLock、LockSupport等),queue...

    Java 多线程与并发(17-26)-JUC线程池- FutureTask详解.pdf

    #### 四、FutureTask源码解析 ##### 4.1 Callable接口 `Callable`是一个泛型接口,其泛型`V`指定了`call`方法返回的类型。与`Runnable`接口不同,`Callable`不仅能够执行任务,还能返回计算结果,并且可以抛出异常...

    Java中Future、FutureTask原理以及与线程池的搭配使用

    Java中的`Future`和`FutureTask`是并发编程中重要的工具,它们允许程序异步执行任务并获取结果。`Future`接口提供了对异步计算结果的访问和控制,而`FutureTask`是`Future`的一个具体实现,它还同时实现了`Runnable`...

    并发编程、juc工具包源码分析笔记

    FutureTask&lt;Integer&gt; task3 = new FutureTask(() -&gt; { log.debug("hello"); return 100; }); new Thread(task3, "t3").start(); // 主线程阻塞,等待 task3 执行完毕并获取结果 Integer result = task3.get(); ...

    简谈java并发FutureTask的实现

    Java并发编程中,`FutureTask`是一个非常关键的组件,它结合了`Runnable`和`Future`接口的能力,使得我们可以在异步执行的任务完成后获取其结果。`FutureTask`不仅是一个可取消的任务,还能报告其执行状态。在这个...

    Android(Java)之多线程结果返回——Future 、FutureTask、Callable、Runnable

    `Future`、`FutureTask`、`Callable`和`Runnable`是Java并发编程中的核心接口和类,它们在Android开发中同样有着广泛的应用。下面将详细介绍这些概念以及它们如何协同工作。 1. `Runnable`: 这是Java中最基础的多...

    性能极限漂移特技,只有头发少的人才知道.docx

    1. **FutureTask源码分析**:深入理解`FutureTask`的工作原理,包括状态管理、执行流程、取消机制等。 2. **手动实现FutureTask**:尝试自己动手实现一个简易版的`FutureTask`类,加深对其内部机制的理解。 3. **...

Global site tag (gtag.js) - Google Analytics