这个程序其它都是正确的,就只有一点,必须把main方法中的myt3和inner变量声明为final的,否则就会产生local variable myt3 is accessed from within inner;needs to declared final编译错误,程序很简单,忘大家耐心!!public class Thread3
   {
      class Inner
         {
            private void m4t1 ( )
               {
                  int i = 5;
                  
                  while ( i -- > 0 )
                     {
                        System.out.println ( Thread.currentThread ( ).getName ( ) + " : Inner.m4t1 ( ) = " + i );
                        
                        try
                           {
                              Thread.sleep ( 500 );
                           }                        catch ( InterruptedException ie )
                          {   }
                     }
               }            private void m4t2 ( )
               {
                  int i = 5;                  while ( i-- > 0 )
                     {
                        System.out.println ( Thread.currentThread ( ).getName ( ) + " : Inner.m4t2 ( ) = " + i );
                        
                        try
                           {
                              Thread.sleep ( 500 );
                           }                        catch ( InterruptedException ie )
                           {   }
                     }
               }
         }      private void m4t1 ( Inner inner )
         {
            synchronized ( inner )    // 使用对象锁
               {
                  inner.m4t1 ( );
               }
         }      private void m4t2 ( Inner inner )
         {
            inner.m4t2 ( );
         }      private Inner createInner ( )
         {
            return new Inner ( );
         }      public static void main ( String [ ] args )
         {
            // local variable myt3 is accessed from within inner;needs to declared final
            Thread3 myt3 = new Thread3 ( );
            // local variable inner is accessed from within inner;needs to declared final
            Inner inner = myt3.new Inner();
            Thread t1 = new Thread ( new Runnable ( )
                                            {
                                               public void run ( )
                                                  {
                                                     myt3.m4t1 ( inner );
                                                  }
                                            } , "t1" );
            Thread t2 = new Thread ( new Runnable ( )
                                            {
                                               public void run ( )
                                                  {
                                                     myt3.m4t2 ( inner );
                                                  }
                                            } , "t2" );
            t1.start();
            t2.start();
         }
   }