【发布时间】:2018-03-20 10:22:41
【问题描述】:
第一:
public class VolatileTest{
public volatile int inc = 0;
public void increase(){
inc++;
}
public static void main(String[] args) {
VolatileTest test = new VolatileTest();
for(int i = 0 ; i < 2 ; i ++){
new Thread(){
public void run(){
for(int j = 0 ; j < 1000 ; j++)
test.increase();
}
}.start();
}
while(Thread.activeCount() > 1)Thread.yield();
System.out.println(test.inc);
}
}
秒:
public class VolatileTest{
public volatile int inc = 0;
public void increase(){
inc++;
}
public static void main(String[] args) {
VolatileTest test = new VolatileTest();
new Thread(){
public void run(){
for(int j = 0 ; j < 1000 ; j++)
test.increase();
}
}.start();
new Thread(){
public void run(){
for(int j = 0 ; j < 1000 ; j++)
test.increase();
}
}.start();
while(Thread.activeCount() > 1)Thread.yield();
System.out.println(test.inc);
}
}
第一个使用for而第二个没有,这是唯一的区别,但是第一个得到的结果小于2000,第二个得到的结果等于2000,为什么?
【问题讨论】:
-
因为并发,试试
public synchonized void increase(){inc++;} -
while(Thread.activeCount() > 1)Thread.yield();是什么意思?你想用它实现什么? -
我想它应该与
while(!workIsDone) //don't terminate循环相同,workIsDone是一些布尔标志,表示所有线程都已完成工作。这可能不是最有效的方法,因为该方法仅返回对线程数的估计,这可能只是错误的,因为线程尚未完成初始化,因此它们不会出现。您可以只保存对线程的引用并进行Thread.join()调用,这更智能。
标签: java multithreading volatile