单例设计模式,写出几个例子
饿汉式:类初始化是不管你需不需要直接创建对象,不存在线程安全问题
直接创建Singleton.java
public class Singleton {public final static Singleton INSTANCE = new Singleton();/*** 构造器私有*/private Singleton(){}
}
枚举Singleton.java
/*** 枚举式* 该类型对象是有限的几个,可以限定为一个,那么就是单例了。*/
public enum Singleton2 {INSTANCE
}
静态代码块Singleton.java
/*** 静态代码块*/
public class Singleton3 {public final static Singleton3 INSTANCE;static{INSTANCE = new Singleton3();}private Singleton3(){}
}
懒汉式:延迟创建实例对象;存在线程安全问题。
线程不安全:Singleton4.java
public class Singleton4 {//设置成private,怕类一调用:如果没创建对象,则是空的。private static Singleton4 instance;//构造器私有话private Singleton4(){}public static Singleton4 getInstance() throws InterruptedException {//判断是否创建,没创建直接创建,创建后直接返回if(instance==null){Thread.sleep(2000);instance = new Singleton4();}return instance;}
}
线程安全:Singleton5.java
适用于多线程
在Singleton4.java
的基础上修改
public static Singleton5 getInstance() throws InterruptedException {synchronized (Singleton5.class){//判断是否创建,没创建直接创建,创建后直接返回if(instance==null){Thread.sleep(2000);instance = new Singleton5();}}return instance;}
以上并不是最优的,以上在第一个线程完成创建之后instance已经部位空。第二个线程可以直接获得,并不用再获得锁。
所以优化后的为
public class Singleton5 {//设置成private,怕类一调用:如果没创建对象,则是空的。private static Singleton5 instance;//构造器私有话private Singleton5(){}public static Singleton5 getInstance() throws InterruptedException {if(instance==null){synchronized (Singleton5.class){//判断是否创建,没创建直接创建,创建后直接返回if(instance==null){Thread.sleep(2000);instance = new Singleton5();}}}return instance;}
}
以上两个的测试方式:
public class TestSingleton {public static void main(String[] args) throws ExecutionException, InterruptedException {/*Singleton4 singleton4 = Singleton4.getInstance();System.out.println(singleton4);*/Callable<Singleton4> callable = new Callable<Singleton4>() {@Overridepublic Singleton4 call() throws Exception {return Singleton4.getInstance();}};ExecutorService es = Executors.newFixedThreadPool(2);Future<Singleton4> submit1 = es.submit(callable);Future<Singleton4> submit2 = es.submit(callable);Singleton4 s1 = submit1.get();Singleton4 s2 = submit2.get();System.out.println(s1==s2);System.out.println(s1);System.out.println(s2);es.shutdown();}
}
静态内部类(适用于多线程)Singleton6 .java
/*** 在内部类被加载和初始化时创建对象*/
public class Singleton6 {private Singleton6(){}private static class inner{private static Singleton6 instance = new Singleton6();}public Singleton6 getSingleton(){return inner.instance;}
}
总结:
饿汉式:枚举类最简单
懒汉式:静态内部类形式最简单
单例设计模式,写出几个例子相关推荐
- 分析JDK中的Runtime的单例设计模式以及使用小例子
package july.star.thread23;import java.io.IOException;/*** RunTime * JDK中的一个单例设计模式* @author MoXingJi ...
- Java设计模式—单例设计模式(Singleton Pattern)完全解析
转载请注明出处:http://blog.csdn.net/dmk877/article/details/50311791 相信大家都知道设计模式,听的最多的也应该是单例设计模式,这种模式也是在开发中用 ...
- java 单例内部类_9 java的关键字static、单例设计模式、初始化块、关键字final、抽象类、接口、内部类...
static关键字 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用.我们有时 ...
- Java查漏补缺(08)关键字:static、单例设计模式、理解main方法、类的成员之四:代码块、final关键字、抽象类、接口、内部类、枚举类、注解、包装类
Java查漏补缺(08)关键字:static.单例设计模式.理解main方法.类的成员之四:代码块.final关键字.抽象类.接口.内部类.枚举类.注解.包装类 本章专题与脉络 1. 关键字:stat ...
- 笔记:Java中的单例设计模式
之前接触过单例模式,当初不明白这样的设计用意,今天特地研究了下java中的单例设计模式的用处及用法. 单例模式:单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.一个类 ...
- 设计延迟加载的“单例设计模式”
今天看毕老师的线程部分,学到了如何设计延迟加载的单例设计模式: 单例设计模式分两种: 1.饿汉模式 2.懒汉模式 先上饿汉式代码: // 饿汉式 class Single{ private stati ...
- export function函数传参_04 js高阶函数(惰性函数、柯里化函数、compose函数)和单例设计模式...
高阶函数的定义 在<javascript设计模式和开发实践>中是这样定义的. 函数可以作为参数被传递: 函数可以作为返回值输出. 结合这两个特点,首先想到的肯定是回调函数,回调函数也是高阶 ...
- 【秒懂设计模式】单例设计模式
秒懂设计模式--单例设计模式 (三)单例设计模式 1.先解释一下,什么是单例模式呢? 在Java中是这样定义的:"一个类有且仅有一个实例,并且自行实例化向整个系统提供." 显然从 ...
- jdk8新特性(接口新特性、lambda表达式、方法引用、函数式接口、Stream流)和单例设计模式
1.单例设计模式 1.概念: 设计模式:使用固有的流程或方式设计出来的类接口.枚举等元素 2.设计原则: 1.私有化构造方法[private.protected] 2.类中创建最终对象[唯一不能被赋值 ...
- 单例设计模式共享数据分析、解决,call_once
一.设计模式大概谈 "设计模式":代码的一些写法,与常规的写法不太一样,程序灵活,维护起来很方便,但是别人接管.阅读代码很痛苦. 用"设计模式"理念写出来的代码 ...
最新文章
- Caffe源码中各种依赖库的作用及简单使用
- python pip在哪里_Python 2.7.9(Linux)中的pip在哪里
- 新手如何快速上手Linux,韦东山告诉你。
- JFrog Artifactory 7.27 上传应用到私服和从maven私服下载制品
- Url几个常用的函数
- Applying Multicycle Exceptions in the TimeQuest Timing Analyzer--Altera Note
- Python_目录的简单操作(新建/查看/删除)
- linux信号及其含义
- linux 内核udp编程,Linux下网络编程实现UDP,还有大量实例
- IOS底层数据结构--class
- PHP获取grpc请求时间,Go gRPC进阶-超时设置(六)
- 阿里云 POSTFIX 邮件服务 PHP
- 【入门书籍】新手入门机器学习,强烈推荐这几本书籍
- 两矩阵相乘的秩的性质_矩阵分析与应用(一,矩阵基础知识)
- web项目报404一直找不到图片(路径绝对正确)
- 微信小程序获取手机号php
- 李白:下终南山过斛斯山人宿置酒
- 网络邻居中打不开计算机,怎么解决Win7 64位旗舰版系统中网上邻居打不开
- C# 委托代理动态的方法
- 如何将 Django 服务器单独部署到 heroku 上