- 浏览: 180179 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (56)
- 算法 (9)
- linux (15)
- oracle (4)
- Project Euler Problem (3)
- 编程珠玑 (2)
- 数学 (1)
- http (1)
- java (19)
- plsql (1)
- apusic (1)
- https (1)
- 备忘 (22)
- 概率 (1)
- EIP (0)
- eclipse (1)
- 安全 (1)
- 公钥体系 (6)
- PKI (2)
- 网络 (2)
- linux,克隆 (0)
- virt-manager (1)
- VMWare (1)
- 克隆 (1)
- logback (1)
- TimeBasedRollingPolicy (0)
- SizeBasedTriggeringPolicy (0)
- properties (1)
- class (1)
- classloader (1)
- netty (1)
- thread dump (1)
- jstack (1)
- jconsole (1)
- java,编码,文件名 (0)
- google (1)
- goagent (1)
- 线程池 (1)
- 博客 (1)
- hexo (1)
- github (1)
- gitcafe (1)
最新评论
-
panhl:
我也实现了一个https://github.com/panho ...
具有相同属性任务串行有序执行的线程池设计 -
fengwei5129:
感谢,最近在看netty源码一直搞不清楚是如何实现的死锁检测, ...
Future机制用于并发编程时的死锁检测 -
OpenMind:
发现IBM JDK的System.nanoTime()没有实现 ...
Java系统时钟几个值得思考的问题 -
lvhongfen:
好了,感谢LZ分享
windows下plsql 设置 里面timestamp显示的格式 -
OpenMind:
今天发现,在linux下还有个很简介的方法查看线程的转储信息, ...
不依赖jstack的java 线程dump和死锁检查工具
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,然后抛出异常避免死锁。
发表评论
-
具有相同属性任务串行有序执行的线程池设计
2014-09-04 15:30 1439我有一个这样的线程池的场景,相信很多人都遇到过: 1,每个用 ... -
不依赖jstack的java 线程dump和死锁检查工具
2013-10-08 14:41 2451java线程dump可以使用jdk的命令“jstack ... -
回忆去年用Java破解unity.exe的过程
2013-05-26 00:48 2686去年我一同学要我破解unity.exe,然后挂在网上卖点钱花 ... -
netty做Pipe一端快一端慢时防止内存溢出进行的操作
2013-05-23 17:12 5943前段时间用netty3.x做了 ... -
为什么InputStream.read()读取一个byte确返回一个int呢?
2013-05-09 16:26 5227问题1:为什么InputStream.read()读取一个 ... -
Java系统时钟几个值得思考的问题
2013-04-10 16:48 4617System.currentTimeMillis()是依赖 ... -
logback的SizeBasedTriggeringPolicy和TimeBasedRollingPolicy联合使用问题
2013-04-01 13:37 15236<appender name="FILE& ... -
netty应用分析
2013-03-07 15:54 0用netty 3.5.7做了一个网络程序,c与s之间有一个心 ... -
Java包装类Integer比较
2012-10-18 16:41 11311,用符号==比较两个对象,意味着比较他们是否是统一个对象。 ... -
java-在非安全网络上建立可信任安全的通道(2/3)
2012-10-05 19:19 1253在不安全的网络环境下进行密钥交互(1/3,前面那一节),容易遭 ... -
java-在非安全网络上建立可信任安全的通道(1/3)
2012-10-05 18:46 1911看到标题,几乎所有人都会想到SSL,但SSL比较重 ... -
java编程方式用CA给证书进行签名/签发证书
2012-10-05 18:02 11985这些代码首先加载CA证书,然后分别用CA给Alice和Bob签 ... -
java编程方式生成CA证书
2012-10-05 17:28 15378下面是java编程方式生成CA证书的代码,使用的是BC的pro ... -
Class.getResourceAsStream
2013-04-06 14:09 1051Class.getResourceAsStream(" ... -
findbugs
2012-03-02 16:41 0findbugsfindbugsfindbugsfindbug ... -
并发编程
2012-03-02 16:41 0C:\Users\Sunny\Desktop\docC:\Us ... -
泛型类里面获取到泛型的类型
2012-03-01 10:15 3459下面的代码可以让你在抽象的泛型类里面获取到泛型的类型 ab ... -
java 学习网站大全
2012-02-27 12:02 0http://scjp.home.sohu.com/ 模拟试题 ... -
First JNI
2012-02-13 14:34 820http://hi.baidu.com/fwmf/blog/i ... -
Java在并发环境下设置唯一标识
2012-02-07 11:02 1455使用hashcode static final Conc ...
相关推荐
书中会首先介绍Java并发编程的基础知识,包括线程的创建和运行,同步机制的基本用法,以及Java内存模型的相关概念。随着章节的深入,作者可能会更深入地讲解Java提供的并发工具,例如锁、原子变量、线程池、以及并发...
7. **死锁、活锁与饥饿**:并发编程中常见的问题,需要理解和避免这些现象,以确保程序的正确性。 8. **Future与Callable接口**:这些接口允许我们异步计算结果,并能够获取任务的执行状态。 9. ** Fork/Join框架*...
│ 高并发编程第一阶段23讲、多线程死锁分析,案例介绍.mp4 │ 高并发编程第一阶段24讲、线程间通信快速入门,使用wait和notify进行线程间的数据通信.mp4 │ 高并发编程第一阶段25讲、多Produce多Consume之间的...
《Java并发编程实践》是一本深入探讨Java多线程编程的经典著作,由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowles和David Holmes等专家共同编写。这本书全面介绍了Java平台上的并发编程技术,是Java开发...
最后,Java并发编程还涉及到Future和Callable接口,它们用于异步计算和获取结果。Executor框架中的FutureTask类结合了Future和Runnable,可以在任务完成后获取结果。 总的来说,这份“java并发编程内部分享PPT”...
最后,作者还讨论了并发编程的最佳实践,包括线程池的使用、Future和Callable接口,以及如何通过并发工具类来简化异步编程。这些内容有助于开发者编写出更加优雅、可维护的并发代码。 附带的源码文件可能是书中示例...
《JAVA并发编程艺术》是Java开发者深入理解和掌握并发编程的一本重要著作,它涵盖了Java并发领域的核心概念和技术。这本书详细阐述了如何在多线程环境下有效地编写高效、可靠的代码,对于提升Java程序员的技能水平...
2. **同步机制**:Java并发编程的核心在于同步,以防止数据不一致性和资源竞争。`synchronized`关键字用于实现临界区的互斥访问,确保同一时刻只有一个线程执行特定代码块。此外,还有`wait()`, `notify()`, `...
### C++并发编程实践 #### 一、简介与并发编程基础 《C++并发编程实践》这本书由Anthony Williams编写,是一本深入讲解C++多线程编程技术的专业书籍。本书旨在帮助读者掌握C++中的并发编程技巧,并通过大量的示例...
书中可能包含了大量示例代码,通过实例解析Java并发编程中的常见问题,如死锁、活锁、饥饿现象,以及如何避免这些问题。此外,还可能涉及了Java内存模型(JMM)的理解,以及如何使用Lock接口和Condition来实现更细...
在Java编程领域,并发编程是一项核心技能,尤其是在大型系统或分布式应用中,高效地处理多线程和并发操作是至关重要的。"Java并发编程与实践"文档深入剖析了这一主题,旨在帮助开发者理解和掌握如何在Java环境中有效...
### Java并发编程实战知识点概述 #### 一、Java并发特性详解 在《Java并发编程实战》这本书中,作者深入浅出地介绍了Java 5.0和Java 6中新增的并发特性。这些特性旨在帮助开发者更高效、安全地编写多线程程序。书中...
《Java 并发编程实战》是一本专注于Java并发编程的权威指南,对于任何希望深入了解Java多线程和并发控制机制的开发者来说,都是不可或缺的参考资料。这本书深入浅出地介绍了如何在Java环境中有效地管理和控制并发...
并发编程是现代多核处理器环境下提高软件性能的关键技术,C++作为一门强大且灵活的编程语言,提供了丰富的工具和机制来支持并发。 在C++中,并发主要涉及以下几个核心概念: 1. **线程**:线程是程序执行的最小...
### Java并发编程实践 #### 一、并发编程基础 ##### 1.1 并发与并行的区别 在Java并发编程中,首先需要理解“并发”(Concurrency)和“并行”(Parallelism)的区别。“并发”指的是多个任务在同一时间段内交替...
5. **并发工具类**:ExecutorService、Future和Callable接口是Java并发编程的重要组成部分,它们提供了线程池管理和异步任务执行的能力。 6. **并发模式**:书中会讨论一些经典的并发模式,如生产者消费者模型、...
总之,《Java并发编程常识》PPT涵盖了从基础概念到高级技术的广泛内容,包括线程管理、同步机制、并发集合、并发工具以及并发问题的解决。对于希望提升并发编程技能的Java开发者来说,这是一份不可多得的学习资料。
Java并发编程是Java开发者必须掌握的关键技能之一,它涉及到如何在多线程环境中高效、安全地执行程序。并发编程能够充分利用多核处理器的计算能力,提高应用程序的响应速度和整体性能。《Java编程并发实战》这本书是...
JUC提供了一套高效且线程安全的组件,用于简化并发编程,帮助开发者实现线程的管理和同步。 2. **java并发编程基础.xmind** 这部分基础内容可能涵盖线程的创建与启动、线程状态、线程优先级、守护线程、线程中断...
以上是对给定文件名的初步解读,实际的内容会更加丰富,包括但不限于线程安全的数据结构、并发容器、锁机制、并发控制、线程池的使用、死锁检测与预防、并发异常处理、网络并发编程等多个方面。通过深入研究这些代码...