volatile被声明之后有什么作用??

nevergrief 2006-04-20 07:43:59
下示例使用两个线程,一个用于计时,一个用于执行实际工作。主线程使用非常简单的算法计算素数。
在它启动之前,它创建并启动一个计时器线程,这个线程会休眠十秒钟,然后设置一个主线程要检查的标志。十秒钟之后,主线程将停止。请注意,共享标志被声明成 volatile。

我试了一下,加与不加好像没有什么区别啊!!??请教各位大侠,谢谢了!!

public class CalculatePrimes extends Thread {

public static final int MAX_PRIMES = 1000000;
public static final int TEN_SECONDS = 10000;

public volatile boolean finished = false;

public void run() {
int[] primes = new int[MAX_PRIMES];
int count = 0;

for (int i=2; count<MAX_PRIMES; i++) {

// Check to see if the timer has expired
if (finished) {
break;
}

boolean prime = true;
for (int j=0; j<count; j++) {
if (i % primes[j] == 0) {
prime = false;
break;
}
}

if (prime) {
primes[count++] = i;
System.out.println("Found prime: " + i);
}
}
}

public static void main(String[] args) {
CalculatePrimes calculator = new CalculatePrimes();
calculator.start();
try {
Thread.sleep(TEN_SECONDS);
}
catch (InterruptedException e) {
// fall through
}

calculator.finished = true;
}
}


...全文
117 7 点赞 打赏 收藏 举报
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
crazycy 2006-04-20
前者是在synchoronized块结束时更新这个变量;这期间别的线程不可读不可写
后者是实时更新,别的线程可以读取最新值
  • 打赏
  • 举报
回复
crazycy 2006-04-20
java线程对于变量是私有的,相互之间不共享,而是获得一个私有的拷贝到自己的线程栈中,这样就会导致同步不一致的问题,
synchoronized和volatile可以解决这个问题
  • 打赏
  • 举报
回复
treeroot 2006-04-20
一般不需要
  • 打赏
  • 举报
回复
blddp 2006-04-20
可以起到同步作用,保证该变量的值在线程之间相同
  • 打赏
  • 举报
回复
dztc 2006-04-20
mark
  • 打赏
  • 举报
回复
btb368 2006-04-20
当某个成员变量使用了修饰符volatile后,通知JVM它的值可能在被一个线程使用的同时被另一个线程修改。
  • 打赏
  • 举报
回复
Preamble 2006-04-20
不清楚,只知道有3中变量不同步的情况。主要是缓存的缘故
  • 打赏
  • 举报
回复
相关推荐
发帖
Java SE
加入

6.2w+

社区成员

Java 2 Standard Edition
申请成为版主
帖子事件
创建了帖子
2006-04-20 07:43
社区公告
暂无公告