大致理解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++);
}
}
}
}
下面代码大致想做到当主线程将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++);
}
}
}
}
看了下各位的意思,大致了解了,线程会有几个先进入到while语句和输出语句之间,然后切换到main,然后再切换进来输出,导致像多输出一轮
惭愧,并发有待提高
@ldh911 这里反正只一个对象,其实用不用static关系不大
而且volatile修饰的变量要原子操作,像double和long的变量赋值操作是非原子的;所以上面只要是主线程做了test.toBeStop = true,下个运行的线程就会知道,在while(!toBeStop)之外,就会退出,但如果运行的线程在while中了,即使看见了test.toBeStop = true,也还得等待到下一次循环;