WEB开发网
开发学院软件开发Java Java 多线程同步问题的探究(二、给我一把锁,我能... 阅读

Java 多线程同步问题的探究(二、给我一把锁,我能创造一个规矩)

 2010-05-14 00:00:00 来源:WEB开发网   
核心提示: 这个程序其实就是让10个线程在控制台上数数,从1数到9999,Java 多线程同步问题的探究(二、给我一把锁,我能创造一个规矩)(2),理想情况下,我们希望看到一个线程数完,这必然不能产生同步的效果,换句话说,然后才是另一个线程开始数数,但是这个程序的执行过程告诉我们

这个程序其实就是让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 }

上一页  1 2 3 4  下一页

Tags:Java 线程 同步

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接