background image

20.                    System.out.println("NO." + threadnum + ":" + i );   
21.        }   
22.        }    
23.       
24.        public static void main(String[] args) throws Exception {    
25.            for(int i=0; i<10; i++){   
26.                    new TestThread(i).start();   
27.                    Thread.sleep(1);   
28.            }   
29.        }    
30.}  
   运行结果:
1.NO.0:887  
2.NO.0:888  
3.NO.0:889  
4.NO.0:890  
5.NO.0:891  
6.NO.0:892  
7.NO.0:893  
8.NO.0:894  
9.NO.7:122  
10.NO.7:123  
11.NO.7:124  
        上面只是一个片段,说明一个问题而已。
  细心的童鞋会发现,NO.0:894 后面是 NO.7:122,也就是说没有按照从 0 开始到
999。
  都说 synchronized 可以实现同步方法或同步块,这里怎么就不行呢?
  先从同步的机制来分析一下,同步是通过锁来实现的,那么上面的例子中,锁定了
什么对象,或锁定了什么类呢?里面有两个变量,一个是 i,一个是 threadnum;i 是方法
内部的,threadnum 是私有的。
  再来了解一下 synchronized 的运行机制:
  在 java 程序中,当使用 synchronized 块或 synchronized 方法时,标志这个区域
进行监视;而 JVM 在处理程序时,当有程序进入监视区域时,就会自动锁上对象或类。
  那么上面的例子中,synchronized 关键字用上后,锁定的是什么呢?
  当 synchronized 方法时,锁定调用方法的实例对象本身做为对象锁。本例中,10
个线程都有自己创建的 TestThread 的类对象,所以获取的对象锁,也是自己的对象锁,
与其它线程没有任何关系。
  要实现方法锁定,必须锁定有共享的对象。
  对上面的实例修改一下,再看看:
1.package thread_test;   
2.  
3./**  
4. * 测试扩展 Thread

   

类实现的多线程程序

5. *