java设计模式-----4、单例模式
单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的一个实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。
其实,GoF对单例模式的定义是:保证一个类,只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。
那么,我们为什么要用单例模式呢?
这是因为在应用系统开发时,我们常常有以下需求:
1、在多个线程之间,比如servlet环境,共享同一个资源或者操作同一个对象。
2、在整个程序空间使用全局变量,共享资源。
3、在大规模系统中,为了性能的考虑,需要节省对象的创建时间等等。
因为单例模式可以保证为一个类只生成唯一的实例对象,所以这些情况,单例模式就派上用场了。
单例模式分为几种情况
1、饿汉式(在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快,同时无法做到延时加载)
public class Person {
    public static final Person person = new Person();
    //构造函数私有化
    private Person(){}
    //提供一个全局的静态方法
    public static Person getPerson(){
        return person;
    }
}
2、接下来是懒汉式(在类加载时不初始化,可以延时加载)
懒汉式可以分为两种,一种线程安全,一种线程不安全
(1)懒汉式(线程不安全,但效率高)
public class Person {
    public static Person person = null;
    //构造函数私有化
    private Person(){}
    //提供一个全局的静态方法
    public static Person getPerson(){
        if(person == null){
            person = new Person();
        }
        return person;
    }
}
(2)懒汉式(线程安全,但效率低)
 public class Person {
     public static Person person = null;
     //构造函数私有化
     private Person(){}
     //提供一个全局的静态方法
     public static synchronized Person getPerson(){
         if(person == null){
             person = new Person();
         }
         return person;
     }
 }
3、静态内部类(可以延时加载)
这种方法是饿汉式的一种升级,这种方式同样利用了classloder的机制来保证初始化instance时只有一个线程,同时实现了延时加载
 public class Person {
     private static class PersonHolder{
         private static final Person person = new Person();
     }
     //构造函数私有化
     private Person(){}
     //提供一个全局的静态方法
     public static final Person getPerson(){
         return PersonHolder.person;
     }
 }
4、双重检查(对懒汉式的升级,效率更高)
public class Person {
    public static Person person = null;
    //构造函数私有化
    private Person(){}
    //提供一个全局的静态方法
    public static Person getPerson(){
        if(person == null){
            synchronized(Person.class){
                if(person == null){
                    person = new Person();
                }
            }
        }
        return person;
    }
}
这样写,只把新建实例的代码放到同步锁中,为了保证线程安全再在同步锁中加一个判断,虽然看起来更繁琐,但是同步中的内容只会执行一次,执行过后,以后经过外层的if判断后,都不会在执行了,所以不会再有阻塞。程序运行的效率也会更加的高。
java设计模式-----4、单例模式的更多相关文章
- java 设计模式之单例模式
		-------Success is getting what you want, happiness is wanting what you get. java设计模式之单例模式(Singleton) ... 
- 折腾Java设计模式之单例模式
		博文原址:折腾Java设计模式之单例模式 单例模式 Ensure a class has only one instance, and provide a global point of access ... 
- Java设计模式之单例模式(七种写法)
		Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton { private static Singleto ... 
- Java 设计模式之单例模式(一)
		原文地址:Java 设计模式之单例模式(一) 博客地址:http://www.extlight.com 一.背景 没有太多原由,纯粹是记录和总结自己从业以来经历和学习的点点滴滴. 本篇内容为 Java ... 
- java设计模式1——单例模式
		java设计模式1--单例模式 1.单例模式介绍 1.1.核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 1.2.常见场景 1.3.单例模式的优点 1.4.常见的五种单例模式实现 ... 
- java设计模式之单例模式你真的会了吗?(懒汉式篇)
		java设计模式之单例模式你真的会了吗?(懒汉式篇) 一.什么是单例模式? 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供 ... 
- java设计模式之单例模式(几种写法及比较)
		概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ... 
- java设计模式- (1)单例模式
		参加校园招聘的笔试,发现公司都会考一些java设计模式,所以上网查询相关内容,总结常用的几种单例模式. 单例模式(Singleton Pattern)是 Java中最简单的设计模式之一.这种类型的设计 ... 
- [转]JAVA设计模式之单例模式
		原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主 ... 
- java设计模式之单例模式(七种方法)
		单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ... 
随机推荐
- windows环境下ElasticSearch5以上版本安装head插件
			我的ElasticSearch版本是5以上的,网上搜了好多安装方式,都不对. 还好找到一个成功的,转载过来做记录. 原文地址:ElasticSearch-5.0安装head插件 步骤 下载node.j ... 
- redis cluster 的ERR max number of clients reached 问题排查
			早上发现微服务连不上redis cluster了,看来下日志如下 [root@win-jrh378d7scu 7005]# bin/redis-cli -c -h 15.31.213.183 -p 7 ... 
- hibernate与Oracle
			今天在用hibernate连接Oracle数据库进行查询时,出现一点小状况 数据库中是有数据的,而且程序本身也没有问题,可就是查不出数据,在经过几个小时的查找下,中遇找到了问题所在,那就是我Oracl ... 
- 前端视频插件Aliplayer播放器简单使用(基于地址播放)
			<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ... 
- 功能一: 数据库访问DAO层方法定义
			功能1: 今天到现在为止 实战课程的访问量 yyyyMMdd courseID 使用数据库来进行存储我们的统计结果 Spark Streaming把统计结果写入到数据库里面 可视化前端根据: yyyy ... 
- asp.net core实时库:SignalR(1)
			SignalR的基本概念 前言 最近在自己的项目中实践了SignalR的使用,asp.net core 2.1版本的时候建立了对SignalR的支持,SignalR的可使用Web Socket, Se ... 
- shortcut&website
			作者:Vincent链接:https://www.zhihu.com/question/28993252/answer/61618961来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ... 
- np.array()和np.mat()区别
			1. 生成数组所需格式不同 mat可以从字符串或列表中生成:array只能从列表中生成 2. 生成的数组计算方式不同 array生成数组,用np.dot()表示矩阵乘积,(*)号或np.multipl ... 
- Java 8学习之Stream API
			一个Stream表面上看与一个集合很类似,允许你改变和获取数据.但是实际上他与集合是有很大区别的: Stream自己不会存储元素.元素可能被存储在底层的集合中,或者根据需要产生出来. Stream操作 ... 
- Javac之inner与nested类
			One way declared types in Java differ from one another is whether the type is a class (which include ... 
