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;
}
}


...全文
148 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
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中变量不同步的情况。主要是缓存的缘故

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧