java设计模式学习-单例模式
java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”单例模式可以保证一个应用中有且只有一个实例,避免了资源的浪费和多个实例多次调用导致出错。
单例模式有以下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
所以相应的,我们用代码实现为:
1.私有化该类的构造函数
2.通过new在本类中创建一个本类对象
3.提供一个共有的方法,给给类创建的对象返回
1. 饿汉式写法
public class Singleton { //饿汉式
int a=1;
private Singleton(){};
private static Singleton instance = new Singleton();
public static Singleton getInstance(){
return instance;
}
调用方法:Singleton instance = Singleton.getInstance();
优点:饿汉式写法能保证线程安全,而且实现简单
缺点:在类加载的时候就完成了实例化,会造成内存浪费(可以忽略不计)
2.懒汉式(线程不安全,不可用)
public class Singleton {
private static Singleton instance=null;
private Singleton() {};
public static Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
因为只有在调用getInstance()这个方法的时候,才会去初始化这个单例,所以称为懒汉式
懒汉式存在线程安全问题,当2个或多个线程同时调用getInstance()方法时,有可能发生如下情况:当第一个线程在执行 if(instance==null)判断的时候,因为此时instance为空,他将会执行instance=new Singleton()来实例化对象,而第二个进程也同时进入了 if(instance==null)的判断,他可能会在第一个线程没有实例化之前进行判断,此时instance依旧为空,于是就实例化了2个Singleton对象,违背了单例模式。
于是,就有了懒汉式的双重校验锁
即加锁并且2次判断instance是否为空
public class Singleton2 {//懒汉式双重校检
private static Singleton2 instance = null;
private Singleton2(){};
public static Singleton2 getInstance() {
if(instance ==null) {
synchronized (Singleton2.class) {
if(instance == null){
instance = new Singleton2();
}
}
}
2次if(instance == null)校验,确保了线程安全,延迟加载,效率较高
懒汉式双重校验完整例子:
public class Singleton_test {
private int a =1;
private static Singleton_test singleton_test =null;
private Singleton_test(){};
public static Singleton_test getInstance(){//懒汉式双重校验锁
if(singleton_test ==null){
synchronized (Singleton2.class) {
if(singleton_test ==null){
singleton_test =new Singleton_test();
}
}
}
return singleton_test;
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public void printInfo() {
System.out.println("number" + a);
}
}
Singleton_test
public class Main_test {
public static void main(String[] args){
Singleton_test singleton_test = Singleton_test.getInstance();
singleton_test.setA(2);
Singleton_test singleton_test2 = Singleton_test.getInstance();
singleton_test2.setA(3);
singleton_test.printInfo();
singleton_test2.printInfo();
if(singleton_test == singleton_test2){
System.out.println("创建的是同一个实例");
}else{
System.out.println("创建的不是同一个实例");
}
}
}
Main_test
内部类
public class Singleton{
private Singleton() {};
private static class SingletonHolder{
private static Singleton instance=new Singleton();
}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}
和饿汉式类似,但又有不同。两者都是采用了类装载的机制来保证初始化实例时只有一个线程。不同
的地方在饿汉式方式是只要Singleton类被装载就会实例化,没有Lazy-Loading的作用,而静态内部类方式在Singleton类被装载时
并不会立即实例化,而是在需要实例化时,调用getInstance方法,才会装载SingletonHolder类,从而完成Singleton的实例化。
类的静态属性只会在第一次加载类的时候初始化,所以在这里,JVM帮助我们保证了线程的安全性,在类进行初始化时,别的线程是
无法进入的。
优点:避免了线程不安全,延迟加载,效率高。
java设计模式学习-单例模式的更多相关文章
- java设计模式学习 ----- 单例模式(Singleton)
单例模式(Singleton) 单例对象(Singleton)是一种经常使用的设计模式. 在Java应用中,单例对象能保证在一个JVM中,该对象仅仅有一个实例存在.单例模式也分三种:懒汉式单例.饿汉式 ...
- Java设计模式学习资源汇总
本文记录了Java设计模式学习书籍.教程资源.此分享会持续更新: 1. 设计模式书籍 在豆瓣上搜索了一把,发现设计模式贯穿了人类生活的方方面面.还是回到Java与程序设计来吧. 打算先归类,再浏览,从 ...
- Java 设计模式之单例模式(一)
原文地址:Java 设计模式之单例模式(一) 博客地址:http://www.extlight.com 一.背景 没有太多原由,纯粹是记录和总结自己从业以来经历和学习的点点滴滴. 本篇内容为 Java ...
- 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设计模式学习记录-状态模式
前言 状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题.状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活多变.这样在客户端使 ...
- Java设计模式学习记录-观察者模式
前言 观察者模式也是对象行为模式的一种,又叫做发表-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式. 咱们目前用的最多的就是各种MQ(Message Queue ...
- Java设计模式学习记录-备忘录模式
前言 这次要介绍的是备忘录模式,也是行为模式的一种 .现在人们的智能手机上都会有备忘录这样一个功能,大家也都会用,就是为了记住某件事情,防止以后自己忘记了.那么备忘录模式又是什么样子的呢?是不是和手机 ...
随机推荐
- maven - 多模块构建
使用idea创建maven项目 点击next输入GroupId和ArtifactId 点击next创建项目,新建项目结构如下 修改demo打包方式为pom 按层级拆分创建模块model,server, ...
- iOS - 数据存储方式(本地化)
iOS中数据存储方式 一般使用以下4种:(已更新) .NSKeyedAchiever//序列化 存放对象 .NSUserDefaults//本质是plist存储 NSData.NSString.NSN ...
- 低功耗蓝牙UUID三种格式转换
熟悉BLE技术同学应该对UUID不陌生,服务.特征值.描述都是有UUID格式定义. 蓝牙广播中对服务UUID格式定义都有三种16 bit UUID.32 bit UUID.128 bit UUID. ...
- 如何在SAP云平台ABAP编程环境里创建自己的Z表
选中ABAP包,右键创建一个新的Database Table: 维护表名为ZBOOKING: 表实现的源代码: @EndUserText.label : 'Jerry''s booking' @Aba ...
- MySQL索引机制详解(B+树)
一.索引是什么? 索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构. 二.为什么要使用索引? 索引能极大的减少存储引擎需要扫描的数据量. 索引可以把随机IO变成顺序IO. 索引可以帮助我 ...
- HBase分布式搭建常见错误
[root@node001 bin]# hbase shell SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found bin ...
- MySql 学习之 一条更新sql的执行过程
上一篇文章咱们说了一条查询sql的执行过程.如果没有看过上一篇文章的可以去看下上一篇文章,今天咱们说说一条更新sql的执行过程. 上面一条sql是将id为1的分数加上10. 那么它的执行流程是怎样的呢 ...
- git使用方法(持续更新)
2018/5/9 最基本的操作: 添加文件.文件夹.所有文件: git add test.py //添加单个文件 git add src //添加文件夹 git add . ...
- Nginx+PHP负载均衡集群环境中Session共享方案 - 运维笔记
在网站使用nginx+php做负载均衡情况下,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态. 下面罗列几种nginx负载均衡 ...
- JVM学习总结
JVM指令执行流程架构图: