急求!!!!多线程执行,为什么明明已经加了synchronized了,还是出现每次结果都不一样呢?谢谢哈~

publicclassTest{
privateinta=0;
publicstaticvoidmain(String[]args){
Testtest=newTest();
for(inti=0;i<=10;i++){
newThread(newRunnable(){
@Override
publicvoidrun(){
test.setA(test.getA()+1);
}
}).start();
}
System.out.println(test.getA());
}
publicintgetA(){
returna;
}
publicsynchronizedvoidsetA(inta){
this.a=a;
}
}
如果我把synchronide放到run方法里则执行正确?为什么呢?锁不是当前对象吗?只有一个test对象啊?
RISEBY
浏览 648回答 2
2回答

繁花如伊

即使读和写都分别是原子的,读、加一(这个不涉及共享内存)、写这三个操作加在一起也不是原子的。线程依然可能在这三个操作之中被打断。如果我把synchronide放到run方法里则执行正确?你咋放的?Java有好多加synchronize的方式。如果是synchronized(test){test.setA(test.getA()+1);}那么就没有问题,因为此时读、加一、写三者作为一个整体被保护起来了。

慕婉清6462132

因为只锁住了写没有锁住读。加了锁的是set方法,所以可以保证同一时间仅有一个线程在执行set方法。get方法没有被锁住,所以可能存在多个线程同时执行get方法。比如有线程a,b,c,它们同时执行get方法读取到1,然后再依次执行set(2),此时最终结果为2。若只有a,b同时读取到1,然后依次进行set将值写为2,之后c再执行get与set,最终结果就是3了。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript