[英]synchronized block doesn't lock the object
有人解释一下,为什么不synchronized block
锁定变量_c
在这里?
public class static_thread implements Runnable{
private static Integer _c=0;
public static void main(String[] args) throws Throwable {
for(int i=0;i<100000;i++){
if(i%2==0){_c++;}
}
System.out.println("one thread: "+_c);
Thread[] t=new Thread[50];
_c=0;
for(int i=0;i<t.length;i++){
t[i]=new Thread(new static_thread(i, i*(100000/50)));
t[i].start();
}
for(Thread _:t){_.join();}
System.out.println("+one thread: "+_c);//wrong answer!
}
public void run() {
for(int i=s;i<(s+l);i++){
if(i%2==0){
synchronized (_c) {//y u no lock?!
_c++;//Inconsistence, not thread-safe, so what is synchronized block is doing here?
}
}
}
}
int s,l;
public static_thread(int s, int l) {
this.s = s;
this.l = l;
}
}
对于每次运行,我都会得到新的错误值。
通过做这个
_c++
您正在更改_c
持有的引用。 它相当于
int value = _c.intValue();
_c = Integer.valueOf(value + 1);
因此
synchronized (_c) {
每次在不同的对象上同步。
请记住, synchronized
块锁定对象,而不是变量。
您应始终使用与不能更改值的变量synchronized
,即。 让它成为final
。
如果由于某种原因需要计数器,请考虑使用AtomicInteger
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.