日期:2014-05-20  浏览次数:20741 次

同步问题 thinking in java中的一段代码 不知如何理解
P494
同步控制块必须指定一个对象才能进行同步,通常,最合理的对象就是在其上调用方法的当前对象:   synchronized(this),在PairManager2中采用了这种方法。这样,当为同步控制块请求锁的时候,对象的其它同步控制方法就不能被调用了。所以其效
果不过是缩小了同步控制的范围。

但是随后就给了一段代码:  

//:   c13:SyncObject.java
//   Synchronizing   on   another   object
//   From   'Thinking   in   Java,   3rd   ed. '   (c)   Bruce   Eckel   2002
//   www.BruceEckel.com.   See   copyright   notice   in   CopyRight.txt.
import   com.bruceeckel.simpletest.*;

class   DualSynch   {
    private   Object   syncObject   =   new   Object();
    public   synchronized   void   f()   {
        System.out.println( "Inside   f() ");
        //   Doesn 't   release   lock:
        try   {
            Thread.sleep(500);
        }   catch(InterruptedException   e)   {
            throw   new   RuntimeException(e);
        }
        System.out.println( "Leaving   f() ");
    }
    public   void   g()   {
        synchronized(syncObject)   {
            System.out.println( "Inside   g() ");
            try   {
                Thread.sleep(500);
            }   catch(InterruptedException   e)   {
                throw   new   RuntimeException(e);
            }
            System.out.println( "Leaving   g() ");
        }
    }
}

public   class   SyncObject   {
    private   static   Test   monitor   =   new   Test();
    public   static   void   main(String[]   args)   {
        final   DualSynch   ds   =   new   DualSynch();
        new   Thread()   {
            public   void   run()   {
                ds.f();
            }
        }.start();
        ds.g();
        monitor.expect(new   String[]   {
            "Inside   g() ",
            "Inside   f() ",
            "Leaving   g() ",
            "Leaving   f() "
        },   Test.WAIT   +   Test.IGNORE_ORDER);
    }
}   ///:~

这里两种同步方法都用到了   但结果并不是     "这样,当为同步控制块请求锁的时候,对象的其它同步控制方法就不能被调用了 "

第一段文字针对的是下面的代码:
//:   c13:CriticalSection.java
//   Synchronizing   blocks   instead   of   entire   methods.   Also
//   demonstrates   protection   of   a   non-thread-safe   class