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

来源:5-1 课程总结

hellowordhaha

2017-06-12 16:20

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回答

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

    number 没有加Volatile 关键字

    是泪还是累

    你这回答还被采纳,我的天。synchronized已经确保了可见性了

    2022-08-10 09:03:46

    共 1 条回复 >

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

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

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

    楼上说错了把

    if(Thread.activeCount()>1){

                Thread.yield();

            }

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

    qq_往烟_...

    对,if改为while

    2017-12-03 18:03:25

    共 1 条回复 >

细说Java多线程之内存可见性

用两种方式实现内存可见性,代领大家深层次学习Java中的内存

55908 学习 · 74 问题

查看课程

相似问题