日志标签:翻译

[翻译]Happens before偏序

分类:java, 并发, 翻译评论:0条作者:ticmy日期:2012-10-11

原文:http://www.cs.umd.edu/class/fall2010/cmsc433/lectures/happens-before.txt “Happens before”是由Leslie Lamport引入的用来描述程序事件的一种偏序关系。 将多线程的执行看作是事件E的轨迹R,定义如下(轨迹只是一种次序): Events E ::= start(T) | end(T) | read(T,x,v) | write(T,x,v) | spawn(T1,T2) | join(T1,T2) | lock(T,x) | unlock(T,x) 这里T是一个线程标识符,x是一个变量,v是一个值。read(T,x,v)事件表示线程T从变量x中读出值v。同时假定轨迹R是结构良好的,即要求在R中,线程T的第一个事件必须是start(T)。在end(T)之后不再有线程T相关的事件。 设E1 < E2为E1和E2在轨迹中出现的顺序,它是可传递的、反自反的和反对称的。定义轨迹R中的happens-before次序(<:)如下: E1 <: E2,当且仅当E1 < E2,且下列条件之一成立: a) thread(E1) = thread(E2) b) E1为spawn(T1,T2), E2为start(T2) c) E2为join(T1,T2),E1为end(T2) d) E1为unlock(T1,x),E2为lock(T2,x) e) 存在这样的E3:E1 <: E3 且 E3 <: E2 (即…

[翻译]字分裂(Word Tearing)

分类:java, 并发, 翻译评论:1条作者:ticmy日期:2012-06-11

《The Java Language Specification Java SE 7 Edition》§17.6 实现Java虚拟机需要考虑的一件事情是,字段之间以及数组元素之间是独立的,更新一个字段或元素不能影响任何其它字段或元素的读取与更新。尤其是,两个线程在分别更新byte数组相邻的元素时,不能互相影响与干扰,且不需要同步来保证顺序一致性。 有些处理器没有提供写单个字节的功能。在这样的处理器上更新byte数组,若只是简单地读取整个字,更新对应的字节,然后将整个字再写回内存,这种做法是违反规则的。这个问题有时候被称为“字分裂(word tearing)”,在单独更新单个字节有难度的处理器上,就需要寻求其它方式了。 例 17.6-1. 检测字分裂 下面的程序是一个检测字分裂的测试用例 public class WordTearing extends Thread { static final int LENGTH = 8; static final int ITERS = 1000000; static byte[] counts = new byte[LENGTH]; static Thread[] threads = new Thread[LENGTH]; final int id; WordTearing(int i) { id = i; } public void run() { byte v = 0; for (int i = 0;…

[翻译]非原子的double和long

分类:java, 并发, 翻译评论:1条作者:ticmy日期:2012-06-10

《The Java Language Specification Java SE 7 Edition》§17.7 为实现Java内存模型,对非volatile的long或double值的一次写操作是被当做两次独立地写操作来处理的:每次写一半——32位。这会导致一种情况,一个线程看到一个写操作写入的前32位,另一个写操作写入的后32位。 对volatile的long和double值的读与写总是原子的。 对引用的读与写总是原子的,不管它们是用32位还是64位实现的。 一些实现可以方便地将64位long或double值上的一次写操作分成相邻的32位值的两次写操作。 为提高效率,这种行为是特定于实现的;java虚拟机实现可以自由选择原子的或分成两次写入long或double值。 Java虚拟机规范鼓励尽可能避免分开处理64位值,同时鼓励程序员将共享的64位值声明为volatile或正确地使用同步以避免并发问题。 下载文章的PDF …