Java 多线程同步问题的探究(二、给我一把锁,我能创造一个规矩)
2010-05-14 00:00:00 来源:WEB开发网我们注意到,该程序通过在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 }
更多精彩
赞助商链接