2011年12月25日

修复 Java 内存模型,第 2 部分

摘要: 开始编写并发代码是一件困难的事情,语言不应当增加它的难度。虽然 Java 平台从一开始就包括了对线程的支持,包括一个计划为正确同步的程序提供“一次编写,到处运行”保证的、跨平台的内存模型,但是原来的内存模型有一些漏洞。虽然许多 Java 平台提供了比 JMM 所要求的更强的保证,但是 JMM 中的漏洞使得无法容易地编写可以在任何平台上运行的并发 Java 程序。所以在 2001 年 5 月,成立了以修复 Java 内存模型为目的的 JSR 133。 上个月,我讨论了其中一些漏洞,这个月,我们将讨论如何堵住它们。修复后的可见性理解 JMM 所需要的一个关键概念是 可见性(visibility)— 阅读全文

posted @ 2011-12-25 20:30 evilying 阅读(296) 评论(0) 推荐(0)

修复 Java 内存模型<1>

摘要: Java 平台把线程和多处理技术集成到了语言中,这种集成程度比以前的大多数编程语言都要强很多。该语言对于平台独立的并发及多线程技术的支持是野心勃勃并且是具有开拓性的,或许并不奇怪,这个问题要比 Java 体系结构设计者的原始构想要稍微困难些。关于同步和线程安全的许多底层混淆是 Java 内存模型 (JMM)的一些难以直觉到的细微差别,这些差别最初是在 Java Language Specification 的第 17 章中指定的,并且由 JSR 133 重新指定。例如,并不是所有的多处理器系统都表现出 缓存一致性(cache coherency);假如有一个处理器有一个更新了的变量值位于其缓存 阅读全文

posted @ 2011-12-25 20:29 evilying 阅读(236) 评论(0) 推荐(0)

volatile in java concurrent mechanism

摘要: Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的synchronized”;与synchronized块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是synchronized的一部分。本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。锁提供了两种主要特性:互斥(mutual exclusion)和可见性(visibility)。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更 阅读全文

posted @ 2011-12-25 19:59 evilying 阅读(266) 评论(0) 推荐(0)

invariant

摘要: 1.3. 类必须实现不变式(Classes Should Enforce Invariants)Bjarne Stroustrup: 我的基本原则式真正的类必须有一个接口,有一个隐含的不变式(invariant)Bill Venners: 不变式(invariant)是什么东西?Bjarne Stroustrup: 什么使一个对象(object)有效?是不变式(invariant)。我以vector举例说明。vector知道自己有n个元素(element),vector也知道自己有一个指针指向这些元素。以上两点就是不变式(invariant)。如果vector实际上竟然有n+1个元素,就出问题 阅读全文

posted @ 2011-12-25 19:55 evilying 阅读(1338) 评论(0) 推荐(0)

Consumer VS Producer

摘要: 生产者与消费者模型中,要保证以下几点:1 同一时间内只能有一个生产者生产2 同一时间内只能有一个消费者消费3 生产者生产的同时消费者不能消费4 消息队列满时生产者不能继续生产5 消息队列空时消费者不能继续消费package ying.threadWait;import java.util.Vector;public class TestConsumer { public static void main(String[] args) { WareHouse warehouse = new WareHouse(0) ; Producer pro1 = new Producer(15... 阅读全文

posted @ 2011-12-25 19:25 evilying 阅读(378) 评论(0) 推荐(0)

守护线程(Daemon Thread)

摘要: 转载自:http://www.cnblogs.com/luochengor/archive/2011/08/11/2134818.html在Java中有两类线程:用户线程 (User Thread)、守护线程 (Daemon Thread)。所谓守护 线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。用户线程和守护线程两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果用 阅读全文

posted @ 2011-12-25 14:36 evilying 阅读(23557) 评论(0) 推荐(2)

Double-checked locking and the Singleton pattern

摘要: Summary: All programming languages have their share of idioms. Many are useful to know and use, and programmers spend valuable time creating, learning, and implementing them. The problem is that some idioms are later proven not to be all that they were purported, or to simply not work as described. 阅读全文

posted @ 2011-12-25 14:22 evilying 阅读(552) 评论(0) 推荐(0)

Eclipse 快捷键 常用

摘要: Ctrl+1快速修复(最经典的快捷键,就不用多说了)Ctrl+D:删除当前行Ctrl+Alt+↓复制当前行到下一行(复制增加)Ctrl+Alt+↑复制当前行到上一行(复制增加)Alt+↓当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)Alt+↑当前行和上面一行交互位置(同上)Alt+←前一个编辑的页面Alt+→下一个编辑的页面(当然是针对上面那条来说了)Alt+Enter显示当前选择资源(工程,or文件or文件)的属性Shift+Enter在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)Shift+Ctrl+Enter在当前行插入空行(原理同上条)Ctrl 阅读全文

posted @ 2011-12-25 09:53 evilying 阅读(199) 评论(0) 推荐(0)

导航