Java中设计模式之单例设计模式-1
单例作用
- 1 节省内存
- 2 可以避免多种状态导致状态冲突
单例的创建步骤
- 1 私有化构造方法
- 2 私有化声明的属性
- 3 getInstance
- 4 方法需要静态
单例分类
1.懒汉式
2.饿汉式
两种单例区别:
饿汉式 线程安全的
懒汉式 线程不安全的
饿汉式:
package 设计模式之单例;
//饿汉式:
public class HungeryMode {
private final static HungeryMode INSTANCE=new HungeryMode();
public static HungeryMode getInstance() {
return INSTANCE;
}
private HungeryMode(){}
}
懒汉式:
package 设计模式之单例;
public class LazyMode {
private static LazyMode instance=null;
public static LazyMode getInstance() {
if(instance==null){
instance=new LazyMode();
}
return instance;
}
private LazyMode(){}
}
测试:
package 设计模式之单例;
public class Test1 {
public static void main(String[] args){
//饿汉式
HungeryMode instance=HungeryMode.getInstance();
HungeryMode instance2=HungeryMode.getInstance();
System.out.println("instance="+instance);
System.out.println("instance2="+instance2);
// 懒汉式
LazyMode instance3=LazyMode.getInstance();
LazyMode instance4=LazyMode.getInstance();
LazyMode instance5=LazyMode.getInstance();
System.out.println("instance3="+instance3+","+instance3.hashCode());
System.out.println("instance4="+instance4+","+instance4.hashCode());
System.out.println("instance5="+instance5+","+instance5.hashCode());
}
}
测试结果:
创建多个对象,测试内存地址,如果相同说明创建的是同一个对象,说明创建的是单例!
延伸—————————–懒汉式线程安全性处理————————–
懒汉式线程不安全原因:
在多线程中,创建单例时,可能出现多个线程进入if(instance==null)执行语句中,在一个线程创建了一个instance后,其他进入执行语句的线程也会接着创建,这样就会产生多个对象,实现不了单例了,此时不安全了。
代码:
package 设计模式之单例;
public class LazyMode2 {
private static LazyMode2 instance=null;
private LazyMode2(){}
public static LazyMode2 getInstance(){
// 双重检查
if(instance==null){// 为了提高效率 尽可能少的让线程反复判断锁
synchronized (LazyMode2.class) {// 静态方法中 不能使用this 就可以用 本类.class 来代替
if(instance==null){
instance=new LazyMode2();
}
}
}
return instance;
}
}
Java中设计模式之单例设计模式-1的更多相关文章
- Java面试 - 什么是单例设计模式,为什么要使用单例设计模式,如何实现单例设计模式(饿汉式和懒汉式)?
什么是单例设计模式? 单例设计模式就是一种控制实例化对象个数的设计模式. 为什么要使用单例设计模式? 使用单例设计模式可以节省内存空间,提高性能.因为很多情况下,有些类是不需要重复产生对象的. 如果重 ...
- java基础学习之单例设计模式学习
最近狂补java基础的我重新学习了下单例,下面直接贴出代码,以作备忘 package com.darling.single; /** * 单例模式 * 单例即在内存中只存在该类的一个实例,要想实现这个 ...
- Java高频面试题--单例设计模式
- java设计模式之单例设计模式
单例设计模式 保证一个类在使用过程中,只有一个实例.优势就是他的作用,这个类永远只有一个实例. 优势:这个类永远只有一个实例,占用内存少,有利于Java垃圾回收. 单例设计模式关键点 私有的构造方法. ...
- Java单例设计模式的实现
1. 单例设计模式的定义 单例设计模式确保类只有一个实例对象,类本身负责创建自己的对象并向整个系统提供这个实例.在访问这个对象的时候,访问者可以直接获取到这个唯一对象而不必由访问者进行实例化. 单例设 ...
- java开发中的23中设计模式详解--大话设计模式
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- Java笔记(十一)……单例设计模式
设计模式 解决某一类问题最行之有效的方法 Java中有23中设计模式 单例设计模式 解决一个类在内存中只存在一个对象 思路 将构造函数私有化 在类中创建一个本类对象 提供一个方法可以获取到对象 两种方 ...
- 转:java单例设计模式
本文转自:http://www.cnblogs.com/yinxiaoqiexuxing/p/5605338.html 单例设计模式 Singleton是一种创建型模式,指某个类采用Singleton ...
- 单例设计模式Singleton之懒加载模式(懒汉模式)【原】
单例设计模式Singleton之懒加载模式(懒汉模式) SingletonLazy.java类 package kingtool; import kingtool.http.IPTool; publi ...
随机推荐
- 2017-4-18 ADO.NET
1.什么是ADO.NET? (是一种数据库访问技术) ADO.NET的名称起源于ADO(ActiveX Data Objects),是一个COM组件库,用于在以往的Microsoft技术中访问 ...
- 在c++中,标准输入string时cin 与getline两个函数之间的区别
cin: cin函数是标准库的输入函数,在读取string时遵循以下规则: 1)读取并忽略开头所有的空白符(包括空格.换行符.制表符). 2)读取字符直到遇到空白符,读取终止. 例如: 当输入的是“ ...
- Java 设计模式(四)-工厂方法模式 (FactoryMethod Pattern)
1 概念定义 1.1 定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 1.2 类型 创建类模式 2 原理特征 2.1 类 ...
- 修改nagios密码和遇到的问题
htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin 密码 密码 service httpd restart 由于本屌丢掉一个s使/ ...
- C语言的一些基础
一.C语言基础: 1.1.main函数是入口函数,用于进行link. 1.2..sln是解决方案的管理文件. 1.3.int:32位.short:16位.long:32位.long long:64位. ...
- CKEditor不借助CKFinder实现图片上传(.net版 ashx实现)
参考博客:http://blog.csdn.net/mydwr/article/details/8669594 本人版本:4.4.6 打开文件:ckeditor/plugins/image/dialo ...
- windows下使用IIS的ARR实现站点的负载均衡
1) 目的: 访问localhost:18066 对下边两个端口负载 localhost:18098 localhost:18099 2) 手段: 1.通过nginx 2.通过iis的AR ...
- 基于swift MKMapkit 开发的地图定位导航
// DTOneViewController.swift // Mapper-JSON // // Created by kcl on 16/8/8. // Copyright © 2016年 ...
- String转int数字格式异常问题
写在前面的话 差不多一年前就计划写博客,可因为种种原因一直没有写,反而我身边的一些同学在我建议他们写博客不久之后就写了,比如张博同学,基本每次总结一个知识点就写一篇,这样不但方便自己以后查看翻阅,也 ...
- ng-options语法详解
我们先看下options的这条语句 ng-options="value.id as value.label group by value.group for value in myOptio ...