文档章节

JAVA设计模式-单例模式

走世界
 走世界
发布于 2017/09/06 01:20
字数 647
阅读 8
收藏 0

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

概念:
  JAVA中单例模式是一种常见的设计模式,单例模式的写法有很多种,这里主要介绍三种:懒汉式单例、饿汉式单例。单例模式有如下特点:
  1、单例类只能有一个实例。
  2、单例类必须自己创建自己的唯一实例。
  3、单例类必须给所有其他对象提供这一实例。

   单例模式确保某个类只有一个实例,且自行实例化向整个系统提供这个实例。在系统中线程池、日志对象、打印机、公用方法等被设计成单例。归根结底就是单例模式确保不一致状态。

一、懒汉试单例

1、懒汉(线程不安全)

package com.example.Controller;

/**
 * Title:懒汉(线程不安全)
 * Author:Administrator
 * Time:2017/5/8 0008
 */
public class Singleton {
    private static  Singleton singleton;
    private Singleton(){}
    //懒汉(线程不安全)
    public static  Singleton getInstance() {
       if (singleton == null){
            singleton = new Singleton();
        }
        return singleton;
    }
}

2、懒汉(线程安全)

package com.example.Controller;

/**
 * Title:懒汉(线程安全)
 * Author:Administrator
 * Time:2017/5/8 0008
 */
public class Singleton {

    private static  Singleton singleton;
    private Singleton(){}
    //懒汉(线程安全)
    public static synchronized Singleton getSingleton() {
        if (singleton == null){
            singleton = new Singleton();
        }
        return singleton;
    }
}

3、双重检查锁定

package com.example.Controller;

/**
 * Title:双重检查锁定
 * Author:Administrator
 * Time:2017/5/8 0008
 */
public class Singleton {

    private static  Singleton singleton;
    private Singleton(){}
    //双重检查锁定
    public static synchronized Singleton getSingleton() {
        if (singleton == null){
            synchronized(Singleton.class){
                if (singleton == null){
                    singleton = new Singleton();
                }
            }

        }
        return singleton;
    }
}

4、静态内部类创建懒汉(线程安全)

package com.example.Controller;

/**
 * Title:静态内部类创建懒汉(线程安全)
 * Author:Administrator
 * Time:2017/5/8 0008
 */
public class Singleton {

    //静态内部类创建懒汉(线程安全)
    private static class LazyHolder{
        private static final Singleton INSTANCE = new Singleton();
    }
    private Singleton(){}
    public static Singleton getInstance(){
        return LazyHolder.INSTANCE;
    }
}

这种比上面1、2、3都好一些,既实现了线程安全,又避免了同步带来的性能影响。

二、饿汉式单例

package com.example.Controller;

/**
 * Title:饿汉(线程安全)
 * Author:Administrator
 * Time:2017/5/8 0008
 */
public class Singleton {

    //饿汉(天生线程安全)
    private Singleton(){}
    private static final Singleton instance = new Singleton();
    //静态工程方法
    public static Singleton getInstance(){
        return  instance;
    }
}

饿汉式在类初始化時就创建好了一个静态对象供系统使用,所以饿汉式天生就是线程安全的。

三、枚举

public enum Singleton {  
    INSTANCE;  
    public void whateverMethod() {  
    }  
} 

它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,个人认为由于jdk1.5中才加入enum特性,用这种方式写不免让人感觉生疏,在实际工作中,也很少看见有人这么写过。

© 著作权归作者所有

走世界
粉丝 7
博文 96
码字总数 91434
作品 0
和平
程序员
私信 提问
加载中

评论(0)

【java设计模式】-00目录

开篇 【java设计模式】-01设计模式简介 创建型模式: 【java设计模式】-02工厂模式(Factory Pattern) 结构型模式: 【java设计模式】-07适配器模式(Adapter Pattern) 行为型模式: 【jav...

osc_3www0d3o
2018/06/18
28
0
Java设计模式之《装饰器模式》及应用场景

原创文章,转载请标注出处:Java设计模式之《装饰器模式》及应用场景 一、概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能。 不同于适配器模式和桥接模式,装饰器模...

osc_6ogjsu3t
2019/03/04
8
0
Java设计模式之《抽象工厂模式》及使用场景

原创文章,转载请标注出处:Java设计模式之《抽象工厂模式》及使用场景 一、概述 抽象工厂模式是对工厂方法模式的再升级,但是二者面对的场景稍显差别。 工厂方法模式面对的目标一般都是单类...

osc_ertc0ko2
04/16
12
0
Java 工厂模式(一)— 抽象工厂(Abstract Factory)模式

一、抽象工厂模式介绍: 1、什么是抽象工厂模式:   抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端在不知道具体产...

osc_vy694i16
2019/02/21
12
0
Java面试,如何在短时间内做突击

面试前很有必要针对性的多刷题,大部分童鞋实战能力强,理论不行,面试前不做准备很吃亏。这里整理了很多常考面试题,希望对你有帮助。 面试技术文 Java岗 面试考点精讲(基础篇01期) Java...

osc_w55yykyo
2019/08/11
102
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周五乱弹 —— 头发和不要头发,你总要选一个

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《雾 缀じた街 ふたつのかげ》- Porkkana 手机党少年们想听歌,请使劲儿戳(这里)...

小小编辑
33分钟前
33
0
一道 算法题 引发的 ‘xx现场’

请 熟悉的语言 去 验证 在输入框中输入的是否是一个正确的网址 初次读题萌新有点 不知所措的样子一查 MDN 吓一跳 ----- 一个不怎么熟悉的方法跳出眼边URL() 构造函数返回一个新创建的 ...

酒窝yun过去了
41分钟前
19
0
如何检查jQuery中是否已选中复选框? - How to check whether a checkbox is checked in jQuery?

问题: I need to check the checked property of a checkbox and perform an action based on the checked property using jQuery. 我需要检查复选框的checked属性,并使用jQuery根据check......

技术盛宴
42分钟前
12
0
mongoose 使用

http://www.mongoosejs.net/ 编写MongoDB验证,转换和业务逻辑是非常麻烦的. 所以Mongoose应运而生了. const mongoose = require('mongoose');mongoose.connect('mongodb://localhost/te......

东东笔记
48分钟前
10
0
微服务

什么是微服务? 使用一套小服务来开发单个应用的方式,每个服务运行在独立的进程里,一般采用轻量级的通讯机制互联,并且他们可以通过自动化的方式部署。 微服务的特征 单一职责 轻量级通信 ...

鸿FW
今天
23
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部