java 单例设计_Java 之单例设计模式

设计模式: 对问题行之有效的解决方式, 其实它是一种思想.

单例设计模式

解决的问题:就是可以保证一个类在内存中的对象唯一性. 即单个实例.

比如对于A 和 B 两个程序使用同一个配置信息对象时, A 对配置信息作出修改, B 也与之对应的更新配置信息, 即需要保证该对象的唯一性.

如何保证对象唯一性呢?

不允许其他程序用 new 创建该类对象

在该类中创建一个本类实例

对外提供一个方法让其他程序可以获取该对象.

步骤:

私有化该类构造函数

通过 new 在本类中创建一个本类对象

定义一个公有方法, 将创建的对象返回

两种方式

饿汉式: 类一加载, 对象就存在了.

懒汉式: 类加载进来, 没有对象, 只有调用 getInstance 方法时, 才会创建对象.

也称为 单例设计模式的延迟加载模式. 但是, 懒汉式在多线程访问时,存在安全隐患.

// 第一种方式: 饿汉式

class Single

{

Single s = new Single(); // 在本类中创建一个本类对象

private Single(){} // 私有化该类构造函数

// 定义一个公有方法, 将创建的对象返回. 用于返回对象 s, 所以返回类型 Single

public Single getInstance()

{

return s;

}

}

class SingleDemo

{

public static void main(String[] args)

{

Single ss = Single.getInstance();

}

}

/*

分析一: main 函数中, getInstance 方法调用不能使用对象调用, 只能使用类名调用.

所以 Single 类中该方法需要使用 static 修饰.

分析二: getInstance 方法为静态方法, 它访问的内容必须是静态的,所以对象 s 也需要静态修饰.

*/

// 改进

class Single

{

private static Single s = new Single();

private Single(){}

public static Single getInstance() // 提供该方法访问实例对象 s, 是为了对象的可控

{

return s;

}

}

class SingleDemo

{

public static void main(String[] args)

{

Single ss = Single.getInstance();

}

}

// 第二种方式: 懒汉式

// 类加载进来, 没有对象, 只有调用 getInstance 方法时, 才会创建对象.

class Single2

{

private static Single2 s = null;

private Single(){}

public static Single2 getInstance()

{

if(s==null)

s = new Single2();

return s;

}

}

// 示例:下列代码的输出结果

class SingleDemo

{

public static void main(String[] args)

{

Test t1 = Test.getInstance();

Test t2 = Test.getInstance();

t1.setNum(10);

t2.setNum(20);

System.out.println(t1.getNum()); // 输出 20

System.out.println(t2.getNum()); // 输出 20

}

}

class Test

{

private int num;

private static Test t = new Test();

private Test(){}

public static Test getInstance()

{

return t;

}

public void setNum(int num)

{

this.num = num;

}

public int getNum()

{

return num;

}

}

// 懒汉式二:避免多线程同时调用getInstance()方法, 可以使用关键字synchronized

class LazySingleton {

private static LazySingleton instance = null;

private LazySingleton(){}

public synchronized static LazySingleton getInstance() {

if(instance == null){

instance = new LazySingleton();

}

return instance;

}

}

// 懒汉式三:为提高系统性能,对"instance = new LazySingleton()"进行锁定

class LazySingleton{

private static LazySingleton instance = null;

private LazySingleton(){}

public static LazySingleton getInstance(){

if(instance == null){ // 此处,有可能造成单例对象不唯一

synchronized(LazySingleton.class){

instance = new LazySingleton();

}

}

return instance;

}

}

// 懒汉式四:双重检查锁定(Double-Check Locking)

class LazySingleton{

// 注意,此处增加修饰符 volatile

private volatile static LazySingleton instance = null;

private LazySingleton(){}

public static LazySingleton getInstance(){

// 第一重判断

if(instance == null){

// 锁定代码块

synchronized(LazySingleton.class){

// 第二重判断

if(instance == null){

instance = new LazySingleton();

}

}

}

return instance;

}

}

//单例第三种方式: Initialization Demand Holder(IoDH)技术

// 在单例类中增加一个静态(static)内部类

class Singleton{

private Singleton(){}

// 静态类

private static class HolderClass {

private final static Singleton instance = new Singleton();

}

public static Singleton getInstance() {

return HolderClass.instance;

}

public static void main(String args[]){

Singleton s1, s2;

s1 = Singleton.getInstance();

s2 = Singleton.getInstance();

System.out.println(s1 == s2);

}

}

_参考资料_

- [JavaSE 基础视频(毕向东)](https://www.bilibili.com/video/av3092292/#page=4)

- [单例模式中的双重检查](http://blog.csdn.net/chenchaofuck1/article/details/51702129)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Javascript之RegExp

RegExp对象的构造器 new RegExp(pattern[, flags]) pattern 正则表达式文本flags 该参数可以是下面几个值的任意组合:g 全局匹配i 忽略大小写m 让开始和结束字符(^ 和 $)工作在多行模式(也就是,^ 和 $ 可以匹配字符串中…

DS汽车通过采用沉浸式虚拟现实技术实现展厅转型

PSA集团(PSA Group)旗下的高端品牌DS汽车公司(DS Automobiles)采用达索系统的“虚拟车库(Virtual Garage)”行业解决方案为全新的SUV车型DS 7 CROSSBACK提供全面支持,推动其展厅转型&#xff0c…

java 日历记事本_calendar 一个用java编写的日历记事本. 具有正常日历功能;也可以用于在不同日期记录下当日重要的事情 - 下载 - 搜珍网...

日历记事本/日历记事本/build/classes/日历记事本/CalendarPad$1.class日历记事本/日历记事本/build/classes/日历记事本/CalendarPad.class日历记事本/日历记事本/build/classes/日历记事本/Month.class日历记事本/日历记事本/build/classes/日历记事本/NotePad.class日历记事…

要的需求 ip提取网站源码带采集 要求是PHP源码

求。ip提取网站源码带采集 要求是PHP源码。必须带采集类似 小峰IP提取网站,安小莫IP提取,迷惘IP提取,冰封IP提取免费类型的 不要淘宝类型的 200 转载于:https://www.cnblogs.com/PS-apple/p/4342866.html

设计模式之PHP项目应用——单例模式设计Memcache和Redis操作类

1 单例模式简单介绍 单例模式是一种经常使用的软件设计模式。在它的核心结构中仅仅包括一个被称为单例类的特殊类。通过单例模式能够保证系统中一个类仅仅有一个实例并且该实例易于外界訪问。从而方便对实例个数的控制并节约系统资源。假设希望在系统中某个类的对象仅仅能存…

java 跳转action_JS 跳转到指定Action | 学步园

最近项目需要在JS中跳转到指定的Action。通过不断的实验和查资料,终于成功。Java SSH2 架构下,正常 配置Action完毕。在xxx.jsp下window.location" ";例如:window.location" /user/ResAction> ";其中ResAction是配置文…

【转】康拓展开

———本文转自:http://www.cnblogs.com/1-2-3/archive/2011/04/25/generate-permutation-part2.html 1、康托展开  康托展开的公式是 Xan*(n-1)!an-1*(n-2)!...ai*(i-1)!...a2*1!a1*0! 其中,ai为当前未出现的元素中是排在第几个(从0开始&a…

java类排序

1、实现Comparator接口 public static class ComparatorImpl implements Comparator<Element>{Overridepublic int compare(Element o1, Element o2) {if(o1.unitPrice > o2.unitPrice)return 1;else if(o1.unitPrice < o2.unitPrice){return -1;}else{return 0;}}…

java jni so_java 用jni调用so全过程

这几天一直在研究JNI的开发过程&#xff0c;顺便把NDK环境搭建一起总结下。在windows环境下开发jni需要c/c编译器的支持&#xff0c;网络上我看很多人使用cygwin。呵呵我不是很喜欢使用它&#xff0c;感觉安装起来挺麻烦的。我使用GNUStep&#xff0c;下载地址http://www.gnust…

ios开发之 -- 自动轮播图创建

这里是oc版本的&#xff0c;简单记录下&#xff1a; 具体代码如下&#xff1a; 1&#xff0c;准备 #define FRAME [[UIScreen mainScreen] bounds] #define WIDTH FRAME.size.width #define HEIGHT FRAME.size.height 2&#xff0c;具体实现 //scrollview的添加_bigScrollView…

学习进度(2016.3.13)

第二周所花时间&#xff08;包括上课&#xff09;14小时代码量&#xff08;行&#xff09;138行博客量&#xff08;篇&#xff09;4篇了解到的知识点动态数组的定义初始化和使用&#xff0c;指定范围获得随机数转载于:https://www.cnblogs.com/zzcs/p/5272365.html

binaryoperator java_BinaryOperatorT接口的用法示例

java Function函数中的BinaryOperator接口用于执行lambda表达式并返回一个T类型的返回值&#xff0c;下面的BinaryOperator用法示例让你简单了解一下。import java.util.function.BinaryOperator;public class TestDemo {public static void main(String[] args) {BinaryOperat…

线性表的顺序存储结构之顺序表类的实现_Java

在上一篇博文——线性表接口的实现_Java中&#xff0c;我们实现了线性表的接口&#xff0c;今天让我们来实现线性表的顺序存储结构——顺序表类。 首先让我们来看下顺序表的定义&#xff1a; 线性表的顺序存储是用一组连续的内存单元依次存放线性表的数据元素&#xff0c;元素在…

Linux下安装jdk

参考于&#xff1a;http://www.cnblogs.com/caosiyang/archive/2013/03/14/2959087.html 一、准备阶段 ①下载jdk-6u45-linux-i586.bin&#xff0c;通过xftp上传至Linux系统中 ②在命令行执行 ./jdk-6u45-linux-i586.bin&#xff0c;生成目录jdk1.6.0_45 ③移动到/usr/share下&…

JDK source 之 ArrayList 需要注意事项

线程安全 ArrayList内部没有实现原子性操作&#xff0c;所以是非线程安全的。如果需要在线程安全的环境下使用List的话&#xff0c;需要使用Vector 或者CopyOnWriteArrayList&#xff0c;具体场景&#xff0c;自行深入了解。 扩容算法 // minCapacity 为需要的最小容量 private…

为Tiny4412设备驱动在proc目录下添加一个可读版本信息的文件

http://blog.csdn.net/morixinguan/article/details/77808088 上节&#xff0c;我们明白了proc文件系统的作用&#xff0c;接下来我们在友善之臂已经写好的led驱动的基础上&#xff0c;在proc目录下创建一个文件夹&#xff0c;然后加入led驱动的版本信息读取。 我们在init函数的…

java audiorecord_Android 录音实现(AudioRecord)

上一篇文章介绍了使用 MediaRecorder 实现录音功能 Android录音实现(MediaRecorder) &#xff0c;下面我们继续看看使用 AudioRecord 实现录音功能。AudioRecord首先看看Android帮助文档中对该类的简单概述: AndioRecord 类的主要功能是让各种 Java 应用能够管理音频资源&#…

SqlServer中的数据类型UniqueIdentifier

SqlServer中的数据类型UniqueIdentifier究竟是什么东东&#xff1f;该类型一般用来做为主键使用&#xff0c;可用SQL语法的newid()来生成一个唯一的值。我想请问的是&#xff0c;这个值是一个长整型的数据值呢&#xff0c;还是个其他的什么值&#xff1f;我在程序中该怎样去控制…

《架构探险——从零开始写Java Web框架》这书不错,能看懂的入门书

这书适合我。 哈哈&#xff0c;结合 以前的知识点&#xff0c;勉强能看懂。 讲得细&#xff0c;还可以参照着弄出来。 希望能坚持 完成啦。。。 原来&#xff0c;JSTL就类似于DJANGO中的模板。 而servlet类中的res,req&#xff0c;玩了DJANGO就觉得好熟悉啦。。。&#xff1a;&…

java 生成 tar.gz_一文教您如何通过 Java 压缩文件,打包一个 tar.gz Filebeat 采集器包...

一、背景最近&#xff0c;小哈主要在负责日志中台的开发工作, 等等&#xff0c;啥是日志中台&#xff1f;俺只知道中台概念&#xff0c;这段时间的确很火&#xff0c;但是日志中台又是用来干啥的&#xff1f;这里小哈尽量地通俗的说下日志中台的职责&#xff0c;再说日志中台之…