synchronized小结

 

1.介绍

synchronized(英)-->同步(中)

同步作用:是为了防止多个线程访问同一数据对象,对数据对象造成损害。

 

 

2.用法

  全局锁(类锁) 对象锁
synchronized方法 有static关键字 无static关键字,取得对象锁
synchronized块 括号里为XX.class,或静态成员变量 括号里为this,或者非静态变量

 

当一个线程访问synchronized修饰的方法或代码块时,根据表中条件获取对应的锁进入。其他线程若想访问其他同步方法,必须判断其他同步方法需要的是什么锁。

 

 

3.类比

①线程就像是进入大楼里的游客,有synchronized修饰的方法为带锁房间(对象锁和全局锁),synchronized修饰的代码块为房间里的带锁屏风(锁同前者),都必须只能一个游客进入访问。其他无synchronized修饰的房间为不需要钥匙的房间和无锁屏风,可以多个游客进入。

②只有两把钥匙,对象钥匙和全局钥匙。

③一旦第一个游客A访问配有对象锁的房间或屏风没有出来,第二个游客B只能访问配有全局锁或没有锁的房间和屏风。剩下的游客因为没有钥匙,只能等A和B出来再竞争钥匙,才能访问同步方法。也可以不等A和B直接应需要访问非同步方法。

 

 

4.缺陷

synchronized方法过多使用保证了安全,但也牺牲了效率,尽量使用synchronized块减少不必要的效率损失。

如单例模式懒汉模式的优化代码中,

public class Single {
    private static Single single = null;
 
    private Single() {
 
    }
 
    public Single getInstance() {
        if (single == null) {
            synchronized (Single.class) {
                if (single == null) {
                    single = new Single();
                }
            }
        }
        return single;
    }
}

  

 

          

 

posted @ 2014-10-25 21:44  emily’s blog  阅读(141)  评论(0)    收藏  举报