资讯专栏INFORMATION COLUMN

夕阳下, 那是我在奔跑——单件模式

lieeps / 1535人阅读

摘要:急切的創建對象饿汉式以上爲饿汉式單列設計,該設計是線程安全的,即不同的線程在調用時返回的是統一對象,在加載這個類時,馬上創建了這個類的唯一單列實列。

單件模式(JAVA實現)

定義

單件模式: 確保一個類只有一個實列, 並提供一個全局訪問點

單件模式和全局變量的區別

若將對象賦值給一個全局變量, 則該對象需在程序開始時就創建好, 而改對象可能不會使用, 造成資源浪費, 而單件模式支持延遲實例化

即急切實例化 和 延遲實例化 的區別

類圖:

單件模式

1 基本用法(懒汉式)
class Singleton
{
    private static Singleton singleton;
    private Singleton(){};
    public static Singleton getInstance()
    {
        if (null == singleton) {
            singleton = new Singleton();
        }
        return singleton;
    }
}

以上爲單列模式的懒汉式設計

該設計時線程不安全的, 即當不同的線程調用getInstance時, 返回不同的對象。

2 急切的創建對象(饿汉式)
class Singleton
{
    private static Singleton singleton = new Singleton();
    private Singleton(){};
    public static Singleton getInstance()
    {
        return singleton;
    }
}

以上爲饿汉式單列設計, 該設計是線程安全的, 即不同的線程在調用getInstance時返回的是統一對象,

JVM在加載這個類時, 馬上創建了這個類的唯一單列實列。

同步 synchronized

其實, 只要把getInstance變成同步的, 就能解決懒汉式線程不安全這一不足,

設計如下:

class Singleton
{
    private static Singleton singleton;
    private Singleton(){};
    public static synchronized Singleton getInstance()
    {
        if (null == singleton) {
            singleton = new Singleton();
        }
        return singleton;
    }
}

以上爲加鎖了的懒汉式單列設計, 該設計是線程安全的, 不同的線程在調用getInstance時, 返回唯一對象,

但是, 後續每一次調用getinstance時,都會進入同步鎖, 同步會降低性能, 這是真的, 尤其是當該類用於很多業務邏輯時,

雙重檢查加鎖

用雙重檢查加鎖, 在getInstance中減少使用同步

class Singleton
{
    private volatile static Singleton singleton;
    private Singleton(){};
    public static Singleton getInstance()
    {
        if (null == singleton) {
            synchronizend(Singleton.class) {
                if (null == singleton) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

需java版本>=1.5, 地版本不支持volatile關鍵字

以上即爲雙重檢查加鎖, 該設計能大大的減少getInstance的性能消耗,

準備是用php來實現的, 但是發現php暫不支持同步代碼快, 此處採用java實現了

轉載請著名出處,godruoyi

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66051.html

相关文章

  • 那是我在夕阳奔跑:边跑边学习html5之audio与video

    摘要:尤其是乔布斯在年发布的一篇的文章。乔布斯在里面写下了关于的一点看法,说明自己为什么不使用,谈到关于的一些问题,比如开放性,安全性,对于设备续航的影响,不利于触摸屏,等等。终于,于年月日,爸爸也放弃治疗了,宣布将于年正式退休。 今天为大家分享一下html5中的视频(video)与音频(audio)。在进入主题之前我们先了解一下Flash与html5这两种技术的时代背景与发展历史。 1.前...

    gself 评论0 收藏0
  • 那是我在夕阳奔跑:边跑边学习html5之audio与video

    摘要:尤其是乔布斯在年发布的一篇的文章。乔布斯在里面写下了关于的一点看法,说明自己为什么不使用,谈到关于的一些问题,比如开放性,安全性,对于设备续航的影响,不利于触摸屏,等等。终于,于年月日,爸爸也放弃治疗了,宣布将于年正式退休。 今天为大家分享一下html5中的视频(video)与音频(audio)。在进入主题之前我们先了解一下Flash与html5这两种技术的时代背景与发展历史。 1.前...

    flybywind 评论0 收藏0
  • 那是我在夕阳奔跑:边跑边学习html5之audio与video

    摘要:尤其是乔布斯在年发布的一篇的文章。乔布斯在里面写下了关于的一点看法,说明自己为什么不使用,谈到关于的一些问题,比如开放性,安全性,对于设备续航的影响,不利于触摸屏,等等。终于,于年月日,爸爸也放弃治疗了,宣布将于年正式退休。 今天为大家分享一下html5中的视频(video)与音频(audio)。在进入主题之前我们先了解一下Flash与html5这两种技术的时代背景与发展历史。 1.前...

    LiuZh 评论0 收藏0
  • 对,是我夕阳奔跑(刚过凌点,‘思否’的第一篇文章 小白开始认真了 哈哈)

    摘要:我们将通过一个构造函数创建的对象,称为是该类的实例孙悟空男玉兔精女奔波霸男使用可以检查一个对象是否是一个类的实例语法对象构造函数如果是,则返回,否则返回所有的对象都是的后代,所以任何对象和做检查时都会返回 使用对象字面量模式来创建一个对象 (它也叫单例模式 //JS与其他语言的单例模式有很大的区别(如Java),但这就是语言的区别) var obj = {}; ...

    vpants 评论0 收藏0

发表评论

0条评论

lieeps

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<