public class VoTest {
private int num=1;
private void increase(){
** synchronized (this){
this.num++;
}**
}
private int read(){
return this.num;
}
public static void main(String[] args) {
final VoTest test=new VoTest();
for (int i = 0; i < 500; i++) {
new Thread(new Runnable() {
@Override
public void run() {
test.increase();
}
}).start();
}
//如果还有子线程在运行,主线程就主动让出cpu资源
//直到所有的子线程都运行结束
if(Thread.activeCount()>1){
Thread.yield();
}
System.out.println("num="+test.read());
}
}
按理说,synchronized关键字可以保证原子性和可见性,但是
这段代码的结果本应该是500,结果却千奇百怪,不管num加不加volatile关键字
都一样。
正确结果应该是501,尝试不用yield方法,而是用循环判断,当活跃线程数大于1,就等待1秒,直到所有线程都运行完毕.
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。