java设计模式1--单例模式
1:单例模式简介
单例模式是一种常用的软件设计模式,它确保某个类只有一个实例,而且自行实例化并向整个系统提供唯一的实例。总而言之就是在系统中只会存在一个对象,其中的数据是共享的
特点:
单例类只能有一个实例,所以一般会用static进行修释。
单例类必须自己创建自己的唯一实例。也就是在类中要new一个自己。
单例类必须向其它对象提供自己的实例。也就是要提供公共的方法获取到自己的实例对象。
线程安全问题:
在使用单例对象的时候,要注意单例对象里面的实例变量是会被多线程共享的,推荐将单例对象里面的实例变量使用无状态的对象,不会因为多个线程的交替调度而破坏自身状态导致线程安全问题。
2:实现单例模式的方式
(1)饿汉式单例(立即加载模式)
//单例类--饿汉式
public class Singleton{
//私有的构造方法,禁止外部对其进行实例化
private Singleton(){};
//用static修饰唯一,这里只要Singleton类加载初始化时会new出自己的实例
private static Singleton single=new Singleton();
//公共的获取对象方法,在此程序中只能通过getInstance方法来获取Singleton实例
public static Singleton getInstance(){
return single;
}
}
因为这里只要Singleton类加载的时候就创建了对象,所以不会存在线程安全问题。
(2)懒汉式单例(延迟加载模式)
//单例类--懒汉式(原始设计方式) ps:这样可能会出现线程不安全,导致多实例
public class Singleton1{
//私有构造方法,禁止外部对其进行实例化
private Singleton(){};
//用static修饰唯一,这里只是声明了single对象等于null,并没有对其进行实例化
private static Singleton single=null;
//公共的获取对象方法
public static Singleton getInstance(){
//只有在获取的时候,而且single没有实例化时才进行实例化
if(single==null){
single=new Singleton1();
}
return single;
}
}
//单例类--懒汉式
public class Singleton1{
//私有构造方法,禁止外部对其进行实例化
private Singleton(){};
//用static修饰唯一,这里只是声明了single对象等于null,并没有对其进行实例化
private static Singleton single=null;
//公共的获取对象方法
public static Singleton getInstance(){
//只有在获取的时候,而且single没有实例化时才进行实例化
if(single==null){ //2:如是没有这个判断会导致一个线程获取single必须要等待上一个线程释放锁才能获取到对象
synchronized(Singleton1.class){ //1:同步锁,解决多个实例问题
if(single==null){
single=new Singleton1();
}
}
}
return single;
}
19 }
1:同步锁:如果不实现同步的话,会导致两个线程同时运行到if(single==null)的时候,两个线程同时满足条件,都会new一个实例对象,导致会出现多个实例问题。
2:如果不加这个判断会导致效率比较低下,一个线程获取single必须要等待上一个线程释放锁才能获取到对象。
使用双重检查进一步做了优化,可以避免整个方法被锁,只对需要锁的代码部分加锁,可以提高执行效率
(3)静态内部类
public class Singleton2{
//私有的构造方法
private Singleton2(){}; //静态内部类
private static class InnerObject{
private static Singleton2 single=new Singleton2();
} public Singleton2 getInstance(){
return InnerObject.single;
}
}
这种方法虽然单例在多线程并发的情况下的线程安全性,但在遇到序列化对象时,在默认的方式运行得到的结果就是多例的,使用的时候需要注意。
(4)静态代码块
public class Singleton3{
//私有构造方法
private Singleton3(){}
private static Singleton3 singleton=null; //静态代码块
static{
singleton=new Singleton3();
}
public static Singleton3 getInstance(){
return singleton;
}
}
这种方式和饿汉模式是差不多的,因为类加载完静态成员变量后会马上加载类的静态代码块
(5)内部枚举类实现
public class SingletonFactory { // 内部枚举类
private enum EnmuSingleton{
Singleton;
private Singleton8 singleton; //枚举类的构造方法在类加载是被实例化
private EnmuSingleton(){
singleton = new Singleton8();
}
public Singleton8 getInstance(){
return singleton;
}
}
public static Singleton8 getInstance() {
return EnmuSingleton.Singleton.getInstance();
}
} class Singleton8{
public Singleton8(){}
}
比较复杂,感觉在实际开发中也很少有人这样用。
3:优缺点
优点:系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能。
缺点:当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new,可能会给其他开发人员造成困扰,特别是看不到源码的时候。
4:适用的场景
需要频繁的创建和销毁的对象。
创建对象耗时过多或者耗费资源过多,但又经常用到的对象。
工具类对象
频繁访问数据库或文件对象
java设计模式1--单例模式的更多相关文章
- 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设计模式之单例模式(七种方法)
单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...
随机推荐
- Jmeter4.0----CSV Data Set Config_对输入参数进行参数化(14)
1.说明 测试接口时,当请求参数不是固定的,每次请求对应的参数都是不同的,就需要对请求参数进行参数化. 2.步骤 第一步:准备数据 (以报告编制人员为例)首先创建.txt文本,自己编辑要参数化的内容 ...
- 使用C#连接 MyCat 链接串
所属专栏: mycat的安装部署以及监控和运维 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u014180504/article/detai ...
- postgresql实现插入数据返回当前的主键ID
<insert id="addUser" parameterType="com.liupan.user"> <selectKey keyPro ...
- java编程如何实现从本地里读取文件1,写入到本地另一个文件2里(多种场景)
不多说,直接上干货! 有时候,我们需要用到这样的一个场景. ReadLocalFile1WriteLocalFile2.java (以下是相当于复制,读取文件1里的全部内容,并写入到文件2里) pac ...
- win10命令行压缩zip文件
1.下载winzip,下载winzip command line(官方) 2.使用命令 "C:\Program Files\WinZip\WZZIP.exe" C:\test\a. ...
- 设置VS代码模板
本文URL:http://www.cnblogs.com/CUIT-DX037/p/6770366.html 打开VS安装目录下:\Microsoft Visual Studio 12.0\Commo ...
- codevs 1664 清凉冷水
1664 清凉冷水 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 闷热的夏天,威斯康辛州的奶制品地区提供冷水供奶牛 ...
- 用python计算直角三角形斜边长
直接上代码 import math def hypotenuse(a,b): return(math.sqrt(a**2+b**2)) side1 = int(input("第一条直角边:& ...
- Centos_linux系统的区别及实际查看
在Linux系统查看系统版本为 32 位还是 64 位 [root@localhost ~]# cat /etc/redhat-release CentOS release 6.8 (Final) [ ...
- 编译出freeswitch的java调用的 jar和so
假设freeswitch 源码路径为 /usr/local/src/freeswitch 1. cd /usr/local/src/freeswitch(源代码的根目录) 执行./configure, ...