volatile的问题

阳明 to life 2012-01-04 05:31:05
大致理解volatile就是线程中变量修改对主内存的及时同步,那下面这段简单的代码为何不能按照理想工作
下面代码大致想做到当主线程将toBeStop更新后所有线程将停止退出执行


import java.util.Arrays;

public class VolatileTest
{
volatile boolean toBeStop;

public static void main(String[] args)
{
VolatileTest test = new VolatileTest();
for(int i = 0 ; i<5;i++)
{
Thread t = test.new MyThread();
t.start();
}
while(Thread.activeCount()>1)
{
Thread[] active = new Thread[5];
System.out.println("还有线程在运行"+Thread.enumerate(active)+":["+Arrays.asList(active)+"]");
if(!test.toBeStop)
test.toBeStop = true;
}
}


class MyThread extends Thread
{

@Override
public void run()
{
int i = 0;
while(!toBeStop)
{
System.out.println(toBeStop+" "+this.getName()+":"+i++);
}
}
}
}
...全文
177 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxbccsu 2012-01-05
  • 打赏
  • 举报
回复
volatile变量没有同步的概念,其作用只是让运行的线程能看到其他线程对此变量的上一次修改的值;
而且volatile修饰的变量要原子操作,像double和long的变量赋值操作是非原子的;

所以上面只要是主线程做了test.toBeStop = true,下个运行的线程就会知道,在while(!toBeStop)之外,就会退出,但如果运行的线程在while中了,即使看见了test.toBeStop = true,也还得等待到下一次循环;
阳明 to life 2012-01-05
  • 打赏
  • 举报
回复
不好意思 昨天断网了 没来得及回复
看了下各位的意思,大致了解了,线程会有几个先进入到while语句和输出语句之间,然后切换到main,然后再切换进来输出,导致像多输出一轮
惭愧,并发有待提高
@ldh911 这里反正只一个对象,其实用不用static关系不大
dracularking 2012-01-04
  • 打赏
  • 举报
回复
就是java語句與語句之間還是有間隙的,對多線程而言。
龙四 2012-01-04
  • 打赏
  • 举报
回复
LZ这个代码完全无法知道什么时候toBeStop被置为true

假如执行完了这一句:

System.out.println("还有线程在运行"+Thread.enumerate(active)+":["+Arrays.asList(active)+"]");

CPU切换时间片给其他线程执行,while还是有可能不同的输出

即使当时cpu都被主线程占了,执行了toBeStop置true的操作,还是有可能执行一次while里的sysout,因为有可能while的条件已经判断过,这时候CPU切换给主线程执行toBeStop置true操作,然后再切回来,接着执行sysout
MiceRice 2012-01-04
  • 打赏
  • 举报
回复
可能还有一个问题需要考虑的是,System.out.println,到系统界面上看得到内容,时间先后上不是绝对一致的。

不过我很好奇,为啥不把 toBeStop,定义为 static ?
若鱼1919 2012-01-04
  • 打赏
  • 举报
回复
System.out.println()往屏幕上打印东西 执行时间太长了....
阳明 to life 2012-01-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhao251021539 的回复:]

亲 最近两天忙了还没来得及看。。。
[/Quote]
你先忙你的。。看你说什么要搞junit源码什么的
meran 2012-01-04
  • 打赏
  • 举报
回复
亲 最近两天忙了还没来得及看。。。
阳明 to life 2012-01-04
  • 打赏
  • 举报
回复
我这边的执行情况是主线程将toBeStop修改为true之后其他线程还会有部分再执行一到两圈(输出的toBeStop当然也是false)然后退出

62,634

社区成员

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

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