为了账号安全,请及时绑定邮箱和手机立即绑定

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

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());
	}
}


正在回答

3 回答

number 没有加Volatile 关键字

0 回复 有任何疑惑可以回复我~
#1

是泪还是累

你这回答还被采纳,我的天。synchronized已经确保了可见性了
2022-08-10 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

楼上说错了把

if(Thread.activeCount()>1){

            Thread.yield();

        }

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

8 回复 有任何疑惑可以回复我~
#1

qq_往烟_0

对,if改为while
2017-12-03 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信