大致理解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++);
}
}
}
}

解决方案 »

  1.   

    我这边的执行情况是主线程将toBeStop修改为true之后其他线程还会有部分再执行一到两圈(输出的toBeStop当然也是false)然后退出 
      

  2.   

    你先忙你的。。看你说什么要搞junit源码什么的
      

  3.   

    System.out.println()往屏幕上打印东西 执行时间太长了....
      

  4.   

    可能还有一个问题需要考虑的是,System.out.println,到系统界面上看得到内容,时间先后上不是绝对一致的。不过我很好奇,为啥不把 toBeStop,定义为 static ?
      

  5.   

    LZ这个代码完全无法知道什么时候toBeStop被置为true假如执行完了这一句:System.out.println("还有线程在运行"+Thread.enumerate(active)+":["+Arrays.asList(active)+"]");CPU切换时间片给其他线程执行,while还是有可能不同的输出即使当时cpu都被主线程占了,执行了toBeStop置true的操作,还是有可能执行一次while里的sysout,因为有可能while的条件已经判断过,这时候CPU切换给主线程执行toBeStop置true操作,然后再切回来,接着执行sysout
      

  6.   

    就是java語句與語句之間還是有間隙的,對多線程而言。
      

  7.   

    不好意思 昨天断网了 没来得及回复
    看了下各位的意思,大致了解了,线程会有几个先进入到while语句和输出语句之间,然后切换到main,然后再切换进来输出,导致像多输出一轮
    惭愧,并发有待提高
    @ldh911 这里反正只一个对象,其实用不用static关系不大
      

  8.   

    volatile变量没有同步的概念,其作用只是让运行的线程能看到其他线程对此变量的上一次修改的值;
    而且volatile修饰的变量要原子操作,像double和long的变量赋值操作是非原子的;所以上面只要是主线程做了test.toBeStop = true,下个运行的线程就会知道,在while(!toBeStop)之外,就会退出,但如果运行的线程在while中了,即使看见了test.toBeStop = true,也还得等待到下一次循环;