Java 多线程同步问题的探究(二、给我一把锁,我能创造一个规矩)
2010-05-14 00:00:00 来源:WEB开发网这个程序其实就是让10个线程在控制台上数数,从1数到9999。理想情况下,我们希望看到一个线程数完,然后才是另一个线程开始数数。但是这个程序的执行过程告诉我们,这些线程还是乱糟糟的在那里抢着报数,丝毫没有任何规矩可言。
但是细心的读者注意到:run方法还是加了一个synchronized关键字的,按道理说,这些线程应该可以一个接一个的执行这个run方法才对阿。
但是通过上一篇中,我们提到的,对于一个成员方法加synchronized关键字,这实际上是以这个成员方法所在的对象本身作为对象锁。在本例中,就是以ThreadTest类的一个具体对象,也就是该线程自身作为对象锁的。一共十个线程,每个线程持有自己线程对象的那个对象锁。这必然不能产生同步的效果。换句话说,如果要对这些线程进行同步,那么这些线程所持有的对象锁应当是共享且唯一的!
我们来看下面的例程:
1 public class ThreadTest2 extends Thread {
2
3 private int threadNo;
4 private String lock;
5
6 public ThreadTest2(int threadNo, String lock) {
7 this.threadNo = threadNo;
8 this.lock = lock;
9 }
10
11 public static void main(String[] args) throws Exception {
12 String lock = new String("lock");
13 for (int i = 1; i < 10; i++) {
14 new ThreadTest2(i, lock).start();
15 Thread.sleep(1);
16 }
17 }
18
19 public void run() {
20 synchronized (lock) {
21 for (int i = 1; i < 10000; i++) {
22 System.out.println("No." + threadNo + ":" + i);
23 }
24 }
25 }
26 }
更多精彩
赞助商链接