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常用设计模式一:单例模式的更多相关文章

  1. 《java常用设计模式之----单例模式》

    一.简介 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创 ...

  2. java常用设计模式总览

    一.java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组 ...

  3. Java与设计模式之单例模式(下) 安全的单例模式

          关于单例设计模式,<Java与设计模式之单例模式(上)六种实现方式>介绍了6种不同的单例模式,线程安全,本文介绍该如何保证单例模式最核心的作用——“实现该模式的类有且只有一个实 ...

  4. Java与设计模式之单例模式(上)六种实现方式

           阎宏博士在<JAVA与模式>中是这样描述单例模式的:作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类.      ...

  5. JAVA常用设计模式(一、单例模式、工厂模式)

    JAVA设计模式之单例模式 import java.util.HashMap; import java.util.Map; /** * 设计模式之单例模式 * 单例模式(Singleton Patte ...

  6. Java设计模式03:常用设计模式之单例模式(创建型模式)

    1.  Java之单例模式(Singleton Pattern ) 单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实 ...

  7. java常用设计模式

    一个程序员对设计模式的理解: "不懂"为什么要把很简单的东西搞得那么复杂. 后来随着软件开发经验的增加才开始明白我所看到的"复杂"恰恰就是设计模式的精髓所在,我 ...

  8. JAVA常用设计模式整理

    设计模式:一个程序员对设计模式的理解:“不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开一把 ...

  9. Java常见设计模式之单例模式

         1.何为单例模式? 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的 ...

随机推荐

  1. xe fmx 怎么改变button颜色

    xe fmx 怎么改变button颜色 改变照相机的默认像素CameraComponent1

  2. EOF与子过程返回

        在2000及其以上系统,P处理语句GOTO新增了:EOF系统标签,意思是移动到当前P处理文件的结尾,EOF==END OF FILE的缩写,意为文件结尾,主要表现形式为:GOTO :EOFOR ...

  3. springMVC学习记录1-使用XML进行配置

    SpringMVC是整个spring中的一个很小的组成,准确的说他是spring WEB这个模块的下一个子模块,Spring WEB中除了有springMVC还有struts2,webWork等MVC ...

  4. margin和padding的四种写法

    我们经常会看到CSS样式属性中外边距margin和内边距padding的各种用法,这里做一个小结,但只简单介绍margin,因为它们的用法大同小异. 方法一. margin:10px; //4个外边距 ...

  5. Haskell语言学习笔记(35)Contravariant

    contravariant 模块 contravariant 模块需要安装 $ cabal install contravariant contravariant-1.4 Prelude> :m ...

  6. dowhile

    public class TestDoWhile { /**do while 至少执行一次 先斩后奏 * 测试dowhile */ public static void main(String[] a ...

  7. jremoting的功能扩展点

    1  InvokeFilter,实现此接口 可以在consumer端 与provider端的调用过程中拦截住请求调用. 已经实现的InvokeFilter包括 RetryInvokeFilter:实现 ...

  8. Python—— *与** 参数说明

    Python *与** 参数说明 '''*用来传递任意个无名字参数,这些参数会一个Tuple的形式访问''' def fall(*z): print sum(z) print "keys t ...

  9. EasuyUI前后台传参

    package com.cn.eport.util; import java.util.List; import java.util.Map; public class PageHelper impl ...

  10. ajax返回填充的数据不显示

    原因:样式与id引用了其他的css或者js,删除其他样式,改变id就可以了