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.何为单例模式? 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的 ...
随机推荐
- foreach 使用&引用赋值要注意的问题
<?php $arr = array('a', 'b', 'c'); $arr2 = array('d', 'e', 'f'); foreach($arr as &$value){ $v ...
- 转载:阿里canal实现mysql binlog日志解析同步redis
from: http://www.cnblogs.com/duanxz/p/5062833.html 背景 早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求.不过早期的数 ...
- eclipse 注释字体不一致的问题
eclipse中 1.解决注释的文字大小不一的情况 2.想让注释和代码大小不一样 3.win10系统下,设置Text Font时找不到Courier New字体 1.解决注释的文字大小不一的情况 打开 ...
- Mysql 知识(3)
1.如何登陆mysql数据库 mysql -u username -p 2.如何开启/关闭mysql服务 service mysql start/stop 3.查看mysql的状态 service m ...
- China cuts bank reserves by $100m to cushion US tariffs
China cuts bank reserves by $100m to cushion US tariffs中国央行定向降准释放千亿美元资金China is cutting the amount o ...
- servlet第三篇
Servlet是一个供其他Java程序(Servlet引擎)调用的Java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度. 针对客户端的多次Servlet请求,通常情况下,服务器只会 ...
- 吴裕雄 数据挖掘与分析案例实战(5)——python数据可视化
# 饼图的绘制# 导入第三方模块import matplotlibimport matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['S ...
- Tensorflow从文件读取数据
http://blog.csdn.net/zengxyuyu/article/details/53289906
- Spring @Qualifier
先说明下场景,代码如下: 有如下接口: public interface EmployeeService { public EmployeeDto getEmployeeById(Long id); ...
- Hibernate 序列生成主键
@Entity @Table(name="TABLE_NAME") public class TableName implements Serializable { @Id @Ge ...