现在了解了java多县城的内存模型,也知道了volatile关键字的作用,但是我现在需要一个程序证实volatile的作用,写了几个程序,无论怎么跑,有没有关键字volatile不影响程序的结果,
不知道哪位大虾能不能提供一个这样的程序:
使用volatile关键字,则程序输出预期的结果,否则输出错误的结果。
问题解决后立即给分!
多谢!!!!
不知道哪位大虾能不能提供一个这样的程序:
使用volatile关键字,则程序输出预期的结果,否则输出错误的结果。
问题解决后立即给分!
多谢!!!!
解决方案 »
- 新手 java 基础小问题....
- 大家进来帮我看看我的问题吧,我概括不出来...谢谢!!
- 帮帮忙,如何在遗传字符串中读取txt中的小数
- 如何把double转换为string并且指定小数点后位数
- 在次求助:被joc.jar混淆过的文件如何反编译为JAVA文件.有什么好的软件和方法吗?
- 求高手解答
- java.util.concurrent.ExecutorService的问题!
- 关于imageIcon的问题 是不是只能用gif???
- 请教:怎样传java数组?
- 请教一个Swing的Socket通信的技术问题.
- 为防止INT形的ID 号重复,,需建一HashMap,每次获得该ID号时,先检查一下,MAP中是否包含该INT值,如不包含,刚PUT该值,留下次对比用。
- 为什么我的JTable中的数据无法刷新?
public volatile int i=0;
public int j=1;
}
然后把这个类写进一个文件看看
你写两个或多个线程,并发访问同一个volatile的变量i
例如在run里面:
if(i>0)
{
Thread,.sleep(10);
System.out.println(i--);
}
如果某个线程的输出为0甚至是负数,则说明你的程序不是线程安全的
但是加了volatile修饰应该就不会有这种情况发生
// 期待更好的测试
class VolatileTester extends Thread {
static int count = 10000000;
long key;// volatile
static long val; public VolatileTester(int k) {
key = ((long)k << 32) | k; // k * 2^32 + k
val = key;
System.out.println("Input="+k + " key="+Long.toHexString(key));
} public void check(long temp) {
long upper32 = temp >>> 32;
long lower32 = 0xffffffffL & temp; if (upper32 != lower32) {
System.out.println("key=" + Long.toHexString(key)
+ " val=" + Long.toHexString(temp)
+ " upper=" + Long.toHexString(upper32)
+ " lower=" + Long.toHexString(lower32));
System.exit(1);
}
} public void run() {
for (int i = 0; i < count; i++) {
check(val);
val = key;
}
} public static void main(String args[]) {
int threads = 10;
for (int t = 1; t < threads; t++)
new VolatileTester(t).start();
}
}
有了volatile,则编译器需要保证每次用该变量时都要保证与主备份相同,对该变量的修改也保证是atomic的.
没有volatile,则编译器就会对该变量进行"优化",怎么快,怎么省事怎么来,对它的操作并不保证atomic.