试下这个:
class t extends Thread {
   private synchronized void f(){
     try {
        for( int i=0; i<10000000; i++ ) { m.n++; m.n--; }
    } catch( Exception e ) {}  
   }
  
   public void run() { 
     f();
   }
}

解决方案 »

  1.   

    gdsean(摇滚java) 
    还是不对。
    问过同事之后终于弄懂了。是我原先理解错误。假设类 c 有同步方法 f ,那么 c 就是个临界资源类型。从 c 生成对象 c1 ,c1 就是个具体的临界资源,JVM 为每个具体的临界资源维护一个等待队列。调用 c1.f() 时,就是对这个临界资源进行访问,所以会先请求加锁 c1, 如果请求加锁失败(比如已经有人加锁占用了 c1),就进入资源 c1 的等待队列。简单一点,使用同步的语句块:
        synchronized ( 共享资源对象 ) { 不能被打断的语句序列... }
    道理和同步方法一样。