java设计模式(一)——单例模式
1、基本介绍
单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,
并且该类只提供-一个取得其对象实例的方法(静态方法)。如:一般情况下,数据库的连接
2、创建方式:
1)饿汉式(静态常量)
2)饿汉式 (静态代码块)
3)懒汉式(线程不安全)
4)懒汉式(线程安全, 同步方法)
5)懒汉式(线程不安全, 同步代码块)
6)双重检查
7)静态内部类
8)枚举
2.1、饿汉式(静态常量)
class Singleton {
private final static Singleton1 singleton = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return singleton;
}
}
优缺点:
1) 优点:这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同步问题。
2)缺点: 在类装载的时候就完成实例化,没有达到Lazy Loading的效果。如果从始至终从未使用过这个实例,则
会造成内存的浪费
3)这种方式基于classloder机制避免了多线程的同步问题,不过,instance 在类装载时就实例化,在单例模式中大
多数都是调用getInstance方法,但是导致类装载的原因有很多种,因此不能确定有其他的方式(或者其他的静
态方法)导致类装载,这时候初始化instance就没有达到lazy loading的效果
4)结论: 这种单例模式可用,可能造成内存浪费
2)饿汉式 (静态代码块)
class Singleton {
private static Singleton singleton;
static {
singleton = new Singleton();
}
private Singleton(){}
public static Singleton getInstance(){
return singleton;
}
}
使用静态块的方式在类加载的时候实例化,优缺点和上面一样
2.3、懒汉式(线程不安全)
class Singleton {
private static Singleton singleton;
private Singleton(){}
public static Singleton getInstance(){
if(singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
优缺点:
1) 起到了Lazy Loading的效果,但是只能在单线程下使用。
2)如果在多线程下, - 一个线程进入了if (singleton = null)判断语句块,还未来得及往下执行,另一个线程也通过
了这个判断语句,这时便会产生多个实例。所以在多线程环境下不可使用这种方式
3) 结论:在实际开发中,不要使用这种方式.
2.4、懒汉式(线程安全, 同步方法)
class Singleton {
private static Singleton singleton;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
优缺点:
1)解决了线程安全问题
2)效率太低了, 每个线程在想获得类的实例时候,执行getlnstance(方法都要进行同步。而其实这个方法只执行
一次实例化代码就够了,后面的想获得该类实例,直接return就行了。方法进行同步效率太低
3)结论: 在实际开发中,不推荐使用这种方式
5)懒汉式(线程不安全, 同步代码块)
class Singleton {
private static Singleton singleton;
private Singleton(){}
public static Singleton getInstance(){
if(singleton == null) {
synchronized (Singleton.class){
singleton = new Singleton();
}
}
return singleton;
}
}
不推荐使用
2.6、双重检查
class Singleton {
private static volatile Singleton singleton;
private Singleton(){}
public static Singleton getInstance(){
if(singleton == null) {
synchronized (Singleton.class){
if(singleton == null ){
singleton = new Singleton();
}
}
}
return singleton;
}
}
volatile:1》当主内存的值更新后,就可以立即更新到工作内存中,保证可见性,避免后来的线程等待
2》还可以防止指令重排。
优缺点:
1) Double-Check 概念是多线程开发中常使用到的,如代码中所示,我们进行了两次if (singleton == null)检查,这
样就可以保证线程安全了。
2)这样, 实例化代码只用执行一次,后面再次访问时,判断if (singleton == nul),直接return实例化对象,也避
免的反复进行方法同步.
3)线程安全; 延迟加载;效率较高
4)结论: 在实际开发中,推荐使用这种单例设计模式
2.7、静态内部类
class Singleton {
private static Singleton singleton;
private static class SingletonInstance{
//声明一个静态属性
private static final Singleton SINGLETON = new Singleton();
}
public static Singleton getInstance(){
return SingletonInstance.SINGLETON;
}
}
优缺点:
1) 这种方式采用了类装载的机制来保证初始化实例时只有-一个线程。
2)静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时,调用getlnstance方法,才
会装载SingletonInstance类,从而完成Singleton的实例化。
3)类的静态属性只会在第一-次加载类的时候初始化,所以在这里,JVM帮助我们保证了线程的安全性,在类进行
初始化时,别的线程是无法进入的。
4)优点:避免了线程不安全,利用静态内部类特点实现延迟加载,效率高
5)结论: 推荐使用.
2.8、枚举
enum Singleton{
INSTANCE;
}
优缺点:
1)不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。,避免反射带来的问题。
2)结论: 推荐使用
java设计模式(一)——单例模式的更多相关文章
- java 设计模式之单例模式
-------Success is getting what you want, happiness is wanting what you get. java设计模式之单例模式(Singleton) ...
- 折腾Java设计模式之单例模式
博文原址:折腾Java设计模式之单例模式 单例模式 Ensure a class has only one instance, and provide a global point of access ...
- Java设计模式之单例模式(七种写法)
Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton { private static Singleto ...
- Java 设计模式之单例模式(一)
原文地址:Java 设计模式之单例模式(一) 博客地址:http://www.extlight.com 一.背景 没有太多原由,纯粹是记录和总结自己从业以来经历和学习的点点滴滴. 本篇内容为 Java ...
- java设计模式1——单例模式
java设计模式1--单例模式 1.单例模式介绍 1.1.核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 1.2.常见场景 1.3.单例模式的优点 1.4.常见的五种单例模式实现 ...
- java设计模式之单例模式你真的会了吗?(懒汉式篇)
java设计模式之单例模式你真的会了吗?(懒汉式篇) 一.什么是单例模式? 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供 ...
- java设计模式之单例模式(几种写法及比较)
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
- java设计模式- (1)单例模式
参加校园招聘的笔试,发现公司都会考一些java设计模式,所以上网查询相关内容,总结常用的几种单例模式. 单例模式(Singleton Pattern)是 Java中最简单的设计模式之一.这种类型的设计 ...
- [转]JAVA设计模式之单例模式
原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主 ...
- java设计模式之单例模式(七种方法)
单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...
随机推荐
- PHP 源码安装常用配置参数和说明
常用的配置参数1. --prefix=/usr/local/php指定 php 安装目录install architecture-independent files in PREFIX 默认/usr/ ...
- 利用Synplify Pro 加时钟约束的问题
可以改名称为"design.ucf"加成新约束. 在使用Xilinx ISE进行综合时,可以与Synplify Pro软件配合,实现较高的综合性能.但是,有时会出现如下问题: “E ...
- Out of memory: Kill process 6033 (mysqld) score 85 or sacrifice child
进入正题前先说明:OOM killer什么时候出现? linux下允许程序申请比系统可用内存更多的内存,这个特性叫Overcommit.这样做是出于优化系统考虑,因为不是所有的程序申请了内存就立刻使用 ...
- C语言 memset函数及其用法
定义 void *memset(void *s, int c, unsigned long n); 描述 将指针变量 s 所指向的前 n 字节的内存单元用一个“整数” c 替换,注意 c 是 int ...
- SQLServer 使用自定义端口连接的方法(转载)
使用过SQL Server的人大多都知道,SQL Server服务器默认监听的端口号是1433,但是我今天遇到的问题是我的机器上有三个数据库实例,这样使用TCP/IP远程连接时就产生了问题.如何在Mi ...
- 【BZOJ】BZOJ3040 最短路 线段树优化Dijkstra
题目描述 N个点,M条边的有向图,求点1到点N的最短路(保证存在). 1<=N<=1000000,1<=M<=10000000 输入格式 第一行两个整数N.M,表示点数和边数. ...
- 如何监控tomcat性能:[1]工具一
| 浏览:155 | 更新:2014-12-13 10:06 1 2 3 4 5 6 分步阅读 tomcat经常被用作中间件,也有直接作WEB的,自带的工具不是很给力,推荐以下的办法 工具/原料 ja ...
- Column 'status' specified twice
字段写了两次, 检查下sql语句, 删除一个就好了.
- 用variant的数据来推导基因表达 | Imputation of Expression Using PrediXcan
一个工具的逻辑得足够完善.意义足够重大,才有资格发在NG上. A gene-based association method for mapping traits using reference tr ...
- JVM 接口初始化规则
1.创建两个接口,MyParent5接口,MyChild5 接口继承自MyParent5接口 public class MyTest5 { public static void main(String ...