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 ...
随机推荐
- Elasticsearch搜索之most_fields分析
顾名思义,most_field就是匹配词干的字段数越多,分数越高,也可设置权重boost. 下面是简易公式(详细评分算法请参考:http://m.blog.csdn.net/article/detai ...
- jquery使用CSS3实现文字动画效果插件Textillate.js
Textillate是一款基于jquery的使用CSS3实现文字动画的小巧插件.Textillate.js集成了一些很棒的使用CSS3动画效果的 JavaScript 库,您可非常轻轻松地把这些动画效 ...
- JavaScript中的数据结构及实战系列(2):栈
开题: 不冒任何险,什么都不做,什么也不会有,什么也不是. 本文目录 栈介绍: JavaScript实现栈: 栈的应用: 栈介绍: 和队列一样,栈也是一种表结构,但是和队列的"先进先出&qu ...
- css 画出三角形
技术分享不一定行文累赘 这里说说最简洁的 css 画出三角形 display: inline-block; border: 10px dashed transparent; border-left: ...
- 生产环境-jvm内存溢出-jprofile问题排查
首先线上开启了dump的参数 dump的内容有2G,先进行压缩打包,传输至本地(scp) tar -czvf dump.tar java_pid4824.hprof 使用Jprofile打开dump ...
- 2017/4/27-Gradle的配置与Spring的下载
Gradle的配置与Spring的下载 1.Gradle 1) 介绍 Gradle是一个基于Groovy的构建工具,类似Maven,但是比其更加简单轻便.它可以自动化地进行软件构建.测试.发布.部署. ...
- Struts2框架的基本使用
前面已经介绍过了MVC思想,Struts2是一个优秀的MVC框架,大大降低了各个层之间的耦合度,具有很好的扩展性.从本篇开始我们学习Struts2的基本用法,本篇主要包括以下内容: Stru ...
- linux内核Makefile整体分析
转自:http://www.cnblogs.com/amanlikethis/p/3675486.html <请阅读原文> 一.概述 1.本文的意义 众多的资料(<嵌入式Linux应 ...
- jquery 模态窗口 蒙层无法覆盖flash解决办法
在应用swf的<object></object>标签中加入如下属性: <param name="wmode" value="transpar ...
- flex布局下,css设置文本不换行时,省略号不显示的解决办法
大致是有一个main容器是flex布局,左边一个logo固定宽高,右边content动态宽度. <div class="main"> <img alt=" ...