Java中volatile关键字的效果 博客分类: Java基础 Java多线程thread工作JVM
程序员文章站
2024-03-24 22:52:52
...
之前在问答频道回答的一道题。问答频道没有收录到博客的功能,自己整理收藏一下。
http://www.iteye.com/problems/1737
使用volatile和不使用volatile的区别在于JVM内存主存和线程工作内存的同步之上。volatile保证变量在线程工作内存和主存之间一致。以下是示例程序,成员变量boolValue用volatile修饰会导致程序很快退出:
http://www.iteye.com/problems/1737
使用volatile和不使用volatile的区别在于JVM内存主存和线程工作内存的同步之上。volatile保证变量在线程工作内存和主存之间一致。以下是示例程序,成员变量boolValue用volatile修饰会导致程序很快退出:
package linyumin.test.thread; /** * * @author llade * */ public class VolatileObjectTest { /** * 成员变量boolValue使用volatile和不使用volatile会有明显区别的。 * 本程序需要多试几次,就能知道两者之间的区别的。 * @param args */ public static void main(String[] args) { final VolatileObjectTest volObj=new VolatileObjectTest(); Thread t1=new Thread(){ public void run(){ System.out.println("t1 start"); for(;;){ volObj.waitToExit(); } } }; t1.start(); Thread t2=new Thread(){ public void run(){ System.out.println("t2 start"); for(;;){ volObj.swap(); } } }; t2.start(); } boolean boolValue;//加上volatile 修饰的是时候,程序会很快退出,因为volatile 保证各个线程工作内存的变量值和主存一致。所以boolValue == !boolValue就成为了可能。 public void waitToExit() { if(boolValue == !boolValue)System.exit(0);//非原子操作,理论上应该很快会被打断。实际不是,因为此时的boolValue在线程自己内部的工作内存的拷贝,因为它不会强制和主存区域同步,线程2修改了boolValue很少有机会传递到线程一的工作内存中。所以照成了假的“原子现象”。 } public void swap() {//不断反复修改boolValue,以期打断线程t1. boolValue = !boolValue; } }
推荐阅读
-
Java中volatile关键字的效果 博客分类: Java基础 Java多线程thread工作JVM
-
回望Java中的final关键字 博客分类: Java基础J2EE javafinalstatic
-
回望Java中的多线程并发(一) 博客分类: Java基础J2EE JAVAthreadrunnable多线程并发
-
Java中的线程Thread总结 博客分类: java threadjava虚拟机jvm
-
Java中的线程Thread总结 博客分类: java threadjava虚拟机jvm
-
Java中的final关键字 博客分类: Java基础 javafinal
-
Java中的static关键字 博客分类: Java基础 javastatic
-
Java中的static关键字 博客分类: Java基础 javastatic
-
JAVA基础----java中final和static关键字的理解 博客分类: JAVA基础 javastaticfinal关键字
-
Swing中的线程探究-1 博客分类: Java Swing Swing多线程UI编程thread