`
OpenMind
  • 浏览: 179043 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Future机制用于并发编程时的死锁检测

    博客分类:
  • java
 
阅读更多

Netty源码里面有个类:DeadLockProofWorker,源码如下:

 

 public static final ThreadLocal<Executor> PARENT = new ThreadLocal<Executor>();

    public static void start(final Executor parent, final Runnable runnable) {
        if (parent == null) {
            throw new NullPointerException("parent");
        }
        if (runnable == null) {
            throw new NullPointerException("runnable");
        }

        parent.execute(new Runnable() {
            public void run() {
                PARENT.set(parent);
                try {
                    runnable.run();
                } finally {
                    PARENT.remove();
                }
            }
        });
    }

    private DeadLockProofWorker() {
        super();
    }

 

 

假设有下面的代码:

 ChannelFuture f = AChannelHandlerContext.getChannel().write(res);  
     f.addListener(new ChannelFutureListener() {              
@Override  
public void operationComplete(ChannelFuture future) throws Exception {  
    future.await();//(1)Thread 1 waiting for itself to be done.    
 //ChannelFuture f is done only if this invoke returns.  
});  
    f.await();//(2)Thead 2 wait for f to be done. 
 

如果ChannelFuture没有死锁检测,那么这两个线程将永远处于死锁状态。

 

Thread2 等待ChannelFuture f 完成,ChannelFuture f 必须把listener的代码跑完才会完成,而listener也在等待future完成,于是死锁就造成了。

 

看如何用线程变量杜绝死锁。

上述代码: AChannelHandlerContext.getChannel().write(res) 会把写的操作放到线程池里异步进行,并且是这样放进去的:

DeadLockProofWorker.start(executor, ARunnable r).

上面的代码在r运行的线程里面可以通过DeadLockProofWorker.PARENT.get()获取到executor,即一个非null的对象,如果在f.await()里面检测一下,就可以知道await是否在r的线程里面了:

 

 

 public ChannelFuture await() throws InterruptedException {
        ...
        checkDeadLock();
        ...      
        return this;
}

 private static void checkDeadLock() {
        if (DeadLockProofWorker.PARENT.get() != null) {
            throw new IllegalStateException(
                    "await*() in I/O thread causes a dead lock or " +
                    "sudden performance drop. Use addListener() instead or " +
                    "call await*() from a different thread.");
        }
    }

 

如果DeadLockProofWorker.PARENT.get() != null 成立,那么当前线程就是启动线程1,然后抛出异常避免死锁。

 

 

分享到:
评论
1 楼 fengwei5129 2016-11-08  
感谢,最近在看netty源码一直搞不清楚是如何实现的死锁检测,但是这个例子给我的感觉类似饥饿不像死锁的感觉,不知您是如何看的?

相关推荐

    Java 并发编程实战.pdf

    书中会首先介绍Java并发编程的基础知识,包括线程的创建和运行,同步机制的基本用法,以及Java内存模型的相关概念。随着章节的深入,作者可能会更深入地讲解Java提供的并发工具,例如锁、原子变量、线程池、以及并发...

    java并发编程实战源码,java并发编程实战pdf,Java

    7. **死锁、活锁与饥饿**:并发编程中常见的问题,需要理解和避免这些现象,以确保程序的正确性。 8. **Future与Callable接口**:这些接口允许我们异步计算结果,并能够获取任务的执行状态。 9. ** Fork/Join框架*...

    Java并发编程实践高清pdf及源码

    《Java并发编程实践》是一本深入探讨Java多线程编程的经典著作,由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowles和David Holmes等专家共同编写。这本书全面介绍了Java平台上的并发编程技术,是Java开发...

    java并发编程内部分享PPT

    最后,Java并发编程还涉及到Future和Callable接口,它们用于异步计算和获取结果。Executor框架中的FutureTask类结合了Future和Runnable,可以在任务完成后获取结果。 总的来说,这份“java并发编程内部分享PPT”...

    java并发编程书籍

    2. **同步机制**:Java并发编程的核心在于同步,以防止数据不一致性和资源竞争。`synchronized`关键字用于实现临界区的互斥访问,确保同一时刻只有一个线程执行特定代码块。此外,还有`wait()`, `notify()`, `...

    JAVA并发编程实践.pdf+高清版+目录 书籍源码

    最后,作者还讨论了并发编程的最佳实践,包括线程池的使用、Future和Callable接口,以及如何通过并发工具类来简化异步编程。这些内容有助于开发者编写出更加优雅、可维护的并发代码。 附带的源码文件可能是书中示例...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段23讲、多线程死锁分析,案例介绍.mp4 │ 高并发编程第一阶段24讲、线程间通信快速入门,使用wait和notify进行线程间的数据通信.mp4 │ 高并发编程第一阶段25讲、多Produce多Consume之间的...

    Java并发编程书籍高清版

    书中可能包含了大量示例代码,通过实例解析Java并发编程中的常见问题,如死锁、活锁、饥饿现象,以及如何避免这些问题。此外,还可能涉及了Java内存模型(JMM)的理解,以及如何使用Lock接口和Condition来实现更细...

    JAVA并发编程艺术pdf版

    《JAVA并发编程艺术》是Java开发者深入理解和掌握并发编程的一本重要著作,它涵盖了Java并发领域的核心概念和技术。这本书详细阐述了如何在多线程环境下有效地编写高效、可靠的代码,对于提升Java程序员的技能水平...

    java并发编程与实践

    在Java编程领域,并发编程是一项核心技能,尤其是在大型系统或分布式应用中,高效地处理多线程和并发操作是至关重要的。"Java并发编程与实践"文档深入剖析了这一主题,旨在帮助开发者理解和掌握如何在Java环境中有效...

    java并发编程实战(英文版)

    ### Java并发编程实战知识点概述 #### 一、Java并发特性详解 在《Java并发编程实战》这本书中,作者深入浅出地介绍了Java 5.0和Java 6中新增的并发特性。这些特性旨在帮助开发者更高效、安全地编写多线程程序。书中...

    C++并发编程实践 C++ Concurrency in Action

    ### C++并发编程实践 #### 一、简介与并发编程基础 《C++并发编程实践》这本书由Anthony Williams编写,是一本深入讲解C++多线程编程技术的专业书籍。本书旨在帮助读者掌握C++中的并发编程技巧,并通过大量的示例...

    (PDF带目录)《Java 并发编程实战》,java并发实战,并发

    《Java 并发编程实战》是一本专注于Java并发编程的权威指南,对于任何希望深入了解Java多线程和并发控制机制的开发者来说,都是不可或缺的参考资料。这本书深入浅出地介绍了如何在Java环境中有效地管理和控制并发...

    java虚拟机并发编程.pdf

    5. **并发工具类**:ExecutorService、Future和Callable接口是Java并发编程的重要组成部分,它们提供了线程池管理和异步任务执行的能力。 6. **并发模式**:书中会讨论一些经典的并发模式,如生产者消费者模型、...

    Java并发编程常识-梁飞.rar

    总之,《Java并发编程常识》PPT涵盖了从基础概念到高级技术的广泛内容,包括线程管理、同步机制、并发集合、并发工具以及并发问题的解决。对于希望提升并发编程技能的Java开发者来说,这是一份不可多得的学习资料。

    java并发编程

    Java并发编程是Java开发者必须掌握的关键技能之一,它涉及到如何在多线程环境中高效、安全地执行程序。并发编程能够充分利用多核处理器的计算能力,提高应用程序的响应速度和整体性能。《Java编程并发实战》这本书是...

    并发编程(各种脑图资源集合).rar

    JUC提供了一套高效且线程安全的组件,用于简化并发编程,帮助开发者实现线程的管理和同步。 2. **java并发编程基础.xmind** 这部分基础内容可能涵盖线程的创建与启动、线程状态、线程优先级、守护线程、线程中断...

    Java并发编程实践源码

    以上是对给定文件名的初步解读,实际的内容会更加丰富,包括但不限于线程安全的数据结构、并发容器、锁机制、并发控制、线程池的使用、死锁检测与预防、并发异常处理、网络并发编程等多个方面。通过深入研究这些代码...

    C++并发编程实战:示例源源码

    并发编程是现代多核处理器环境下提高软件性能的关键技术,C++作为一门强大且灵活的编程语言,提供了丰富的工具和机制来支持并发。 在C++中,并发主要涉及以下几个核心概念: 1. **线程**:线程是程序执行的最小...

    Java并发编程相关资料

    死锁是并发编程中的常见问题,当两个或更多线程互相等待对方释放资源而无法继续执行时,就会发生死锁。预防和解决死锁需要遵循一些原则,如避免持有多个锁、按顺序获取锁等。 Java内存模型(JMM)规定了线程如何...

Global site tag (gtag.js) - Google Analytics