解决方案 »

  1.   

    我测试了一下发现,是你的Thread.sleep(1000)的问题,如下图,当ss1进入createSingletonInstance函数时,i会变为1,会因为sleep函数而停在这里一会儿,这个时候ss2就进入了createSingletonInstance函数,i还是会加1,即这个时候i是2.而且这个时候两个线程都还在sleep函数这一块,没有往下执行,所以之后两个线程往下执行之后,两个语句输出来的就都是i=2的输出语句。这样解释你应该理解了吧
      

  2.   

    但是我给函数createSingletoninstance加锁了呀,同一时刻应该改只有一个线程可以访问啊,为何线程ss1,ss2都可以调用该函数?
      

  3.   


    但是我给函数createSingletoninstance加锁了呀,同一时刻应该改只有一个线程可以访问啊,为何线程ss1,ss2都可以调用该函数?
      

  4.   

    对于这个问题,首先要了解对象锁,你每次创建了新的对象,就会有新的对象锁,每次线程使用的都是新的对象。试试这样写:
    TestSingleton s = new TestSingleton();
    Thread t1 = new Thread(s, "ss1");
    Thread t2 = new Thread(s, "ss2");
    Thread t3 = new Thread(s, "ss3");
    t1.start();
    t2.start();
    t3.start();这样就是多个线程调用一个对象的同步方法
      

  5.   

    最基本的都不懂,你对对象的方法加了锁 这个意思就是同一个实例会互斥,你new了两个对象 怎么互斥啊 哥!
      

  6.   

    方法前加锁是保证不会有两个线程同时执行该类的方法,你的这个情况类本身就是一个线程,没有什么实际意义i是你这个线程自身的成员变量,如果你想让两个线程互斥访问这个成员变量,在这个成员变量上加锁sychronized(i)
      

  7.   

    public static void main(String[] args) {
         TestSingleton ts = new TestSingleton();
            Thread t1 = new Thread(ts, "ss1");
            Thread t2 = new Thread(ts, "ss2");
            t1.start();
            t2.start();
        }