Chinaunix首页 | 论坛 | 博客
  • 博客访问: 860225
  • 博文数量: 221
  • 博客积分: 10033
  • 博客等级: 上将
  • 技术积分: 2325
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-06 22:00
文章分类

全部博文(221)

文章存档

2010年(8)

2009年(1)

2008年(69)

2007年(63)

2006年(80)

我的朋友

分类: Java

2007-11-19 19:50:10

线程类:调用不同的方法,于是建立了两个线程类

 1public class ThreadA implements Runnable{
 2    public void run() {
 3        TestThread.execute();//调用同步静态方法
 4    }

 5}

 6public class ThreadB implements Runnable{
 7    public void run() {
 8        TestThread test=new TestThread();
 9        test.test();//调用非同步非静态方法
10    }

11}

调用:

1Runnable runabbleA=new ThreadA();
2Thread a=new Thread(runabbleA,"A");                
3a.start();
4Runnable runabbleB=new ThreadB();
5Thread b=new Thread(runabbleB,"B");                
6b.start();

注意:
1、用synchronized 来锁定一个对象的时候,如果这个对象在锁定代码段中被修改了,则这个锁也就消失了。看下面的实例:

目标类:

 1public class TestThread {
 2     private static final class TestThreadHolder {
 3            private static TestThread theSingleton = new TestThread();
 4            public static TestThread getSingleton() {
 5                return theSingleton;
 6            }

 7            private TestThreadHolder() {
 8            }

 9        }

10     
11    private Vector ve =null;
12    private Object lock=new Object();
13    private TestThread(){
14        ve=new Vector();
15        initialize();
16    }

17    public static TestThread getInstance(){
18        return TestThreadHolder.getSingleton();
19    }

20    private void initialize(){
21        for(int i=0;i<100;i++){
22            ve.add(String.valueOf(i));
23        }

24    }

25    public void reload(){
26        synchronized(lock){
27            ve=null;            
28            ve=new Vector();
29                        //lock="abc"; 
30            for(int i=0;i<100;i++){
31                ve.add(String.valueOf(i));
32            }

33        }

34        System.out.println("reload end");
35    }

36    
37    public boolean checkValid(String str){
38        synchronized(lock){
39            System.out.println(ve.size());
40            return ve.contains(str);
41        }

42    }

43}

说明:在reload和checkValid方法中都增加了synchronized关键字,对lock对象进行加锁。在不同线程中对同一个对象实例分别调用reload和checkValid方法。
在reload方法中,不修改lock对象即注释lock="abc"; ,结果在控制台输出reload end后才输出100。说明是同步调用的。
如果在reload方法中修改lock对象即去掉注释,结果首先输出了一个数字(当前ve的大小),然后输出reload end。说明是异步调用的。

2、单例模式中对多线程的考虑

 1public class TestThread {
 2     private static final class TestThreadHolder {
 3            private static TestThread theSingleton = new TestThread();
 4            public static TestThread getSingleton() {
 5                return theSingleton;
 6            }

 7            private TestThreadHolder() {
 8            }

 9        }

10    private Vector ve =null;
11    private Object lock=new Object();
12    private TestThread(){
13        ve=new Vector();
14        initialize();
15    }

16    public static TestThread getInstance(){
17        return TestThreadHolder.getSingleton();
18    }

19        '''
20}

说明:增加了一个内部类,在内部类中申明一个静态的对象,实例化该单例类,初始化的数据都在单例类的构造函数中进行。这样保证了多个实例同时访问的时候,初始化的数据都已经成功初始化了。

总结:
A. 无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁,所以首先应知道需要加锁的对象
B.每个对象只有一个锁(lock)与之相关联。
C.实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。

阅读(1112) | 评论(0) | 转发(0) |
0

上一篇:synchronized 2

下一篇:synchronized学习

给主人留下些什么吧!~~