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. *