问答详情
源自:5-1 课程总结

加了同步代码关键字,但是还是会出现线程安全问题,怎么回事???

public class VolatileT {
	private int number = 0;
	
	public int getNumber(){
		return this.number;
	}
	
	public void increase(){
		synchronized(this){
		this.number++;
		}
	}
	
	public static void main(String[] arg){
		final VolatileT vo = new VolatileT();
		for(int i=0;i<500;i++){
			new Thread(new Runnable(){
				@Override
				public void run() {
					vo.increase();
				}
			}).start();
			//System.out.println(vo.getNumber());
			System.out.println(Thread.activeCount());
		}
		if(Thread.activeCount()>1){
			Thread.yield();
		}
		System.out.println("result="+ vo.getNumber());
	}
}


提问者:hellowordhaha 2017-06-12 16:20

个回答

  • qq_简体字冯同学_0
    2017-06-14 15:25:32
    已采纳

    number 没有加Volatile 关键字

  • 慕哥3398815
    2019-07-23 20:33:03

    number加了Volatile 关键字他也会出错的,因为没有保证原子性,才出现这种问题

  • 做人蛋定
    2017-11-08 22:39:20

    楼上说错了把

    if(Thread.activeCount()>1){

                Thread.yield();

            }

    这个错了吧 你写if的话不管满不满足都会往下执行,所以输出的时候线程还没有跑完,当然会错咯