public class TestSynconnized {
int a ;
private Object object = new Object();
private volatile Integer  i = 0;
public  void  Add()
{synchronized(i)
{
System.out.println("++i="+(++i)+Thread.currentThread().getName());;
}
}
public static  void main(String args[])
{
TestSynconnized testSynconnized = new TestSynconnized();
for(int i =0;i<20;i++)
{

Thread thread = new Thread(new  Runnable() {
public void run() {
for(int i =0;i<1000;i++)
testSynconnized.Add();
}
});

thread.start();
}
while(Thread.activeCount()>1)
Thread.yield(); System.out.println(testSynconnized.i);
}
}给 integer  i加了同步和volatile 为什么最后输出的值还会少于20000呢大神们解释下

解决方案 »

  1.   

    你这里锁的i是各个线程都有一份自己的copy,和主内存之间进行通信,但是你的i 一直变,所以锁不住,你改成 一个static的变量就好了
      

  2.   

    这个差点被误导,你再多声明一个string型的变量,然后用string变量做为锁就可以了.
    如:
    private String t="xcc";
    public void Add() {
    synchronized (t) {
    System.out.println("++i=" + (++i)+ Thread.currentThread().getName());
    }
    }
    原因很简单,因为你的i每调用一个线程都会被重新赋于另一个值,这样synchronized(i)中的这个i就不是一个同一个对象了,所以会发生错乱
      

  3.   

    同步块的原理是调用参数对象的对象锁,所以需要所有线程访问到的是同一个对象,也就是i要是类域(static)