多线程的典型例子

来源:互联网 发布:windows上能开发iosapp 编辑:程序博客网 时间:2024/04/28 21:01

今天听一位高手说:

如果没去了解过内存模型  jsr133规范 就别说自己会多线程编程。

感觉所言不虚

例子如下:

package com.joker.thread;


public class A{
private static long num = Long.MAX_VALUE;
public static void main(String[] args){
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
new Thread(){
public void run(){
while (true) {
long l = num;
if (l != Long.MAX_VALUE && l != Long.MIN_VALUE) {
System.out.println(l);
return;
}
}
}
}.start();
new Thread(){
public void run(){
while (true) {
if (num > 0)
num = Long.MIN_VALUE;
else
num = Long.MAX_VALUE;
}
}
}.start();
}
}

这个例子在32位操作系统上,会打印出一个数字,而在64位操作系统上却不会。原因是:

就是一个线程不断的改变long值,long是64位的。
但如果你是32位jvm  在一次写入long值分了2次写  
如果一个线程在读 就可能读错了 。
解决方法是:在num前面加上修饰符:volatile.该修饰符会在每次调用值的时候强制检查一次值。

原创粉丝点击