WEB开发网
开发学院软件开发Java 内存屏障与JVM并发 阅读

内存屏障与JVM并发

 2010-05-11 00:00:00 来源:WEB开发网   
核心提示: //coderunbyfirstthread//coderunbysecondthread1intentFirst=true;intentSecond=true;23while(intentSecond)while(intentFirst)//volatileread4if(turn!=0){i

   // code run by first thread   // code run by second thread 
 
 1  intentFirst = true;     intentSecond = true; 
 2 
 3  while (intentSecond)  while (intentFirst)    // volatile read 
 4   if (turn != 0) {   if (turn != 1) {    // volatile read 
 5    intentFirst = false;    intentSecond = false; 
 6    while (turn != 0) {}    while (turn != 1) {} 
 7    intentFirst = true;    intentSecond = true; 
 8   }        } 
 9 
10  criticalSection();  criticalSection(); 
11 
12  turn = 1;   turn = 0;         // volatile write 
13  intentFirst = false;  intentSecond = false;   // volatile write 

硬件优化可以在没有内存屏障的情况下打乱这段代码,即使编译器按照程序员的想法顺序列出所有的内存操作。考虑第三、四行的两次顺序volatile 读操作。每一个线程检查其他线程是否发信号想进入关键区域,然后检查轮到谁操作了。考虑第12、13行的两次顺序写操作。每一个线程把访问权释放给其他线程,然后撤销自己访问关键区域的意图。读线程应该从不期望在其他线程撤销访问意愿后观察到其他线程对turn变量的写操作。这是个灾难。但是如果这些变量没有 volatile修饰符,这的确会发生!例如,没有volatile修饰符,第二个线程在第一个线程对turn执行写操作(倒数第二行)之前可能会观察到第一个线程对intentFirst(倒数第一行)的写操作。关键词volatile避免了这种情况,因为它在对turn变量的写操作和对 intentFirst变量的写操作之间创建了一个先后关系。编译器无法重新排序这些写操作,如果必要,它会利用一个内存屏障禁止处理器重排序。让我们来看看一些实现细节。

上一页  1 2 3 4 5 6 7  下一页

Tags:内存 屏障 JVM

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接