如题

解决方案 »

  1.   

    对象锁对象锁:谁拿到这个对象的锁,就可以执行这个对象里的synchronized 方法,其他没拿到锁的线程被阻塞,要等待别人执行完后交出锁,再去争取;对象锁只对synchronized 方法起作用,非synchronized 方法不受影响,仍然可以访问比如
    class A
    {
        public synchronized void  f()
        {
        }    public synchronized void  g()
        {
        }
    }A a = new A();
    A b = new A();当一个线程正在调用 a.f()时,其他线程此时就无法调用 a.f()和a.g()及A中其他synchronized 方法,会被阻塞,直到a.f()调用完成后,才交出对象a的锁;
    但此时可以通过另一个对象b来调用f()或g()
    对象a的调用不会影响对象b的调用
    所以锁住的是对象
    当然如果不是synchronized 方法就不受这个限制
    另外:类中的static方法是属于"类锁"(具体怎么个称呼忘了)
    如果上诉的f()方法为static,则 调用a.f()时,其他线程调用b.f()也会被阻塞
    因为此时a.f()和b.f()其实调用的是同一个方法
    我这样解释
    不知道你清楚不