Java Concurrent And Threads
wanghaolovezlq
这个作者很懒,什么都没留下…
展开
-
可见性——“重排序”现象
代码示例:public class NoVisibility { private static boolean ready; private static int number; private static class ReaderThread extends Thread { public void run() { ...原创 2009-09-23 12:35:47 · 158 阅读 · 0 评论 -
非阻塞算法简介(看吧,没有锁定!)
Java™ 5.0 第一次让使用 Java 语言开发非阻塞算法成为可能,java.util.concurrent 包充分地利用了这个功能。非阻塞算法属于并发算法,它们可以安全地派生它们的线程,不通过锁定派生,而是通过低级的原子性的硬件原生形式 —— 例如比较和交换。非阻塞算法的设计与实现极为困难,但是它们能够提供更好的吞吐率,对生存问题(例如死锁和优先级反转)也能提供更好的防御。在本文中,...原创 2009-08-11 11:24:43 · 119 阅读 · 0 评论 -
修复 Java 内存模型(在 JSR 133 中 JMM 会有什么改变?)
开始编写并发代码是一件困难的事情,语言不应当增加它的难度。虽然 Java 平台从一开始就包括了对线程的支持,包括一个计划为正确同步的程序提供“一次编写,到处运行”保证的、跨平台的内存模型,但是原来的内存模型有一些漏洞。虽然许多Java 平台提供了比 JMM 所要求的更强的保证,但是 JMM 中的漏洞使得无法容易地编写可以在任何平台上运行的并发 Java 程序。所以在2001 年 5 月,...原创 2009-08-08 10:45:09 · 218 阅读 · 0 评论 -
什么是 Java 内存模型,最初它是怎样被破坏的?
活跃了将近三年的 JSR 133,近期发布了关于如何修复 Java 内存模型(Java Memory Model, JMM)的公开建议。原始 JMM 中有几个严重缺陷,这导致了一些难度高得惊人的概念语义,这些概念原来被认为很简单,如 volatile、final 以及 synchronized。在这一期的 Java 理论与实践 中,Brian Goetz 展示了如何加强 volatile 和 f...原创 2009-08-08 10:35:24 · 108 阅读 · 0 评论 -
双重检查锁定(全面理解这一失效的编程习语)
所有的编程语言都有一些共用的习语。了解和使用一些习语很有用,程序员们花费宝贵的时间来创建、学习和实现这些习语。问题是,稍后经过证明,一些习语并不完全如其所声称的那样,或者仅仅是与描述的功能不符。在 Java编程语言中,双重检查锁定就是这样的一个绝不应该使用的习语。在本文中,Peter Haggar介绍了双重检查锁定习语的渊源,开发它的原因和它失效的原因。 ...原创 2009-08-08 09:50:34 · 175 阅读 · 0 评论 -
synchronized 关键字
java中每个对象都有一个隐式的锁,如果一个方法由synchronized关键字声明,那些对象的锁将保护整个方法。也就是说,要调用这个方法,线程必须先获得对象的锁。隐式对象锁只有一个关联条件。wait方法把线程加到等待集中,notify/notifyAll方法解除等待线程的阻塞状态。也两个方法等价于Condition(条件变量)的await,signal/signalAll...原创 2009-08-05 11:18:42 · 86 阅读 · 0 评论 -
Condition(条件变量)
一个线程进入临界区,却发现它必须等待某个条件满足后才能执行,则要使用一个条件变量来管理那些已获得锁却不能开始执行有用的工作的线程。 看个示例,假定有一个绑定的缓冲区,它支持 put 和 take 方法。如果试图在空的缓冲区上执行 take 操作,则在某一个项变得可用之前,线程将一直阻塞;如果试图在满的缓冲区上执行 put 操作,则在有空间变得可用之前,线程将一直阻塞...原创 2009-08-05 11:04:38 · 130 阅读 · 0 评论 -
JMM(java存储模型)
JMM(java存储模型)原创 2009-10-15 15:56:28 · 104 阅读 · 0 评论 -
并发相关的错误模式
并发相关的错误模式原创 2009-10-14 15:46:48 · 71 阅读 · 0 评论 -
处理异常的线程终止
处理异常的线程终止原创 2009-10-10 09:38:05 · 113 阅读 · 0 评论 -
线程可能导致内存泄露的情况
继承Thread的线程,在交给jdk1.4并发包的线程池执行完毕后并没有被释放资源,而且也没被再利用,而是白白占着内存,导致内存泄露。 默认的Thread本身初始化在1.4是将自己加入了一个ThreadGroup,如果你没有调用它的start方法,JVM不会在该线程结束后将这个thread从TreadGroup中移除,这就是造成内存泄露的原因所在。不过在JDK6...原创 2009-10-03 10:52:32 · 404 阅读 · 0 评论 -
中断的理解
注意:中断通常中实现取消最明智的选择!原创 2009-09-30 10:24:10 · 91 阅读 · 0 评论 -
JDK工具箱中Timer的缺陷问题
示例代码如下:import java.util.*;import static java.util.concurrent.TimeUnit.SECONDS;/** * OutOfTime * <p/> * Class illustrating confusing Timer behavior * * @author Brian Goetz...原创 2009-09-25 16:13:16 · 254 阅读 · 0 评论 -
并发诀窍清单
并发诀窍清单如下:原创 2009-09-25 15:00:05 · 72 阅读 · 0 评论 -
安全发布模式
安全发布模式原创 2009-09-24 10:46:53 · 71 阅读 · 0 评论 -
局部创建对象(不正确发布:当好对象变坏时)
代码清单1:public class StuffIntoPublic { public Holder holder; public void initialize() { holder = new Holder(42); }} 代码清单2:public class Holder { private ...原创 2009-09-23 16:50:25 · 163 阅读 · 0 评论 -
volatile变量
volatile变量 volatile变量是一种同步的弱形式。它确保对一个变量的更新以可预见的方式告知其他的线程。当一个域声明为volatile类型后,编译器与运行时会监视这个变量:它是共享的,而且对它的操作不会与其他的内存操作一起被重排序。volatile变量不会缓存在寄存器或者缓存在对其他处理器隐藏的地方。所以,读一个volatile类型的变量时,总会返回由某一线程所写...原创 2009-09-23 15:20:47 · 117 阅读 · 0 评论 -
流行的原子(新原子类是 java.util.concurrent 的隐藏精华)
在 JDK 5.0 之前,如果不使用本机代码,就不能用 Java 语言编写无等待、无锁定的算法。在 java.util.concurrent 中添加原子变量类之后,这种情况发生了变化。请跟随并行专家 Brian Goetz 一起,了解这些新类如何使用 Java 语言开发高度可伸缩的无阻塞算法。十五年前,多处理器系统是高度专用系统,要花费数十万美元(大多数具有两个到四个处理器)。现在,多...原创 2009-08-11 12:54:47 · 104 阅读 · 0 评论