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

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

 2010-05-14 00:00:00 来源:WEB开发网   
核心提示: 我们注意到,该程序通过在main方法启动10个线程之前,Java 多线程同步问题的探究(二、给我一把锁,我能创造一个规矩)(3),创建了一个String类型的对象,并通过ThreadTest2的构造函数,对象锁是共享且唯一的!于是,我们看到了预期的效果:10个线程不再是争先恐后的报数了,将这个对

我们注意到,该程序通过在main方法启动10个线程之前,创建了一个String类型的对象。并通过ThreadTest2的构造函数,将这个对象赋值给每一个ThreadTest2线程对象中的私有变量lock。根据Java方法的传值特点,我们知道,这些线程的lock变量实际上指向的是堆内存中的同一个区域,即存放main函数中的lock变量的区域。

程序将原来run方法前的synchronized关键字去掉,换用了run方法中的一个synchronized块来实现。这个同步块的对象锁,就是 main方法中创建的那个String对象。换句话说,他们指向的是同一个String类型的对象,对象锁是共享且唯一的!

于是,我们看到了预期的效果:10个线程不再是争先恐后的报数了,而是一个接一个的报数。

再来看下面的例程:

 1 public class ThreadTest3 extends Thread {
 2 
 3     private int threadNo;
 4     private String lock;
 5 
 6     public ThreadTest3(int threadNo) {
 7         this.threadNo = threadNo;
 8     }
 9 
10     public static void main(String[] args) throws Exception {
11         //String lock = new String("lock");
12         for (int i = 1; i < 20; i++) {
13             new ThreadTest3(i).start();
14             Thread.sleep(1);
15         }
16     }
17 
18     public static synchronized void abc(int threadNo) {
19         for (int i = 1; i < 10000; i++) {
20             
21                 System.out.println("No." + threadNo + ":" + i);
22                 
23             
24                 
25             
26         }
27     }
28 
29     public void run() {
30         abc(threadNo);
31     }
32 }

上一页  1 2 3 4  下一页

Tags:Java 线程 同步

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