1.饿汉模式

public class SingletonEntity2 {

    // 在类加载的时候创建对象:饿汉模式
public static SingletonEntity2 obj = new SingletonEntity2(); // 构造方法私有化
private SingletonEntity2(){} public static SingletonEntity2 getInstance(){
return obj;
} }

2.懒汉模式

public class SingletonEntity {

    // 静态变量存放在方法区中,类加载的时候赋值,而且只会赋值一次,懒汉模式
public static SingletonEntity obj = null; // 构造方法私有化
private SingletonEntity() {} // 对外提供获取实例的公开的静态的方法
public static SingletonEntity getInstance() {
if (obj == null) {
obj = new SingletonEntity();
System.out.println("新创建实例");
}
System.out.println("直接返回实例");
return obj;
} }

3.测试类

public static void main(String[] args) {

    SingletonEntity obj1 = SingletonEntity.getInstance();
SingletonEntity obj2 = SingletonEntity.getInstance();
System.out.println(obj1 == obj2); // true }

==========================================================================================================================================

懒汉模式不安全性测试:

1.起现成类:

public class RunnableThreadTest implements Runnable {

    @Override
public void run() { SingletonEntity obj = SingletonEntity.getInstance();
System.out.println(Thread.currentThread().getName()+" "+obj); } }

2.测试类:

public class SingletonTest {

    public static void main(String[] args) {

        Thread thread1 = new Thread(new RunnableThreadTest());
Thread thread2 = new Thread(new RunnableThreadTest());
thread1.start();
thread2.start(); } }

3.运行结果:

Thread-0 com.beijing.singleton.SingletonEntity@406866f9
Thread-1 com.beijing.singleton.SingletonEntity@25eb939e

==========================================================================================================================================

改善结果:推荐使用双检查锁机制

public class SingletonEntity {

    // 静态变量存放在方法区中,类加载的时候赋值,而且只会赋值一次,懒汉模式
public static volatile SingletonEntity obj = null; // 构造方法私有化
private SingletonEntity() {
} // 对外提供获取实例的公开的静态的方法
public static SingletonEntity getInstance() {
try {
// 双检查所机制
if (obj == null) {
synchronized (SingletonEntity.class) {
if (obj == null) {
Thread.sleep(1000);
obj = new
SingletonEntity();
}
}
}

} catch (Exception e) {
e.printStackTrace();
}
return obj;
} }
为什么要用volatile修饰instance?
原因:在于instance = new SingletonEntity()的时候,在内存中实际上是分3步执行的:
1)分配对象的内存空间:memory = allocate();
2)初始化对象:ctorInstance(memory);
3)指向分配的地址:instance =memory
多线程在执行的时候,2 3可能发生重排序。即有可能线程A执行到第3步的时候,读取到instance不为null,就返回。实际上此时还未执行第二部即未初始化。
加上volatile就可以避免2 3步重排序来保证线程安全。

singleton单例模式小结的更多相关文章

  1. singleton单例模式

    单例设计模式 单例设计模式概述    单例模式就是要确保类在内存中只有一个对象,该实例必须自动创建,并且对外提供    优点:    在系统内存中只存在一个对象,因此可以解决系统资源,对于一些需要频繁 ...

  2. Singleton 单例模式 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. 设计模式01: Singleton 单例模式(创建型模式)

    Singleton 单例模式(创建型模式) 动机(Motivation)当进行软件开发是会有这样一种需求:在系统中只有存在一个实例才能确保它们的逻辑正确性.以及良好的效率.这应该是类设计者的责任,而不 ...

  4. Singleton单例模式是最简单的设计模式,它的主要作用是保证在程序执行生命周期中,使用了单类模式的类仅仅能有一个实例对象存在。

                                                                                                        ...

  5. SingleTon单例模式总结篇

    在Java设计模式中,单例模式相对来说算是比较简单的一种构建模式.适用的场景在于:对于定义的一个类,在整个应用程序执行期间只有唯一的一个实例对象. 一,懒汉式: 其特点是延迟加载,即当需要用到此单一实 ...

  6. (转)Singleton 单例模式(懒汉方式和饿汉方式)

    原文地址:http://www.cnblogs.com/kkgreen/archive/2011/09/05/2166868.html 单例模式的概念: 单例模式的意思就是只有一个实例.单例模式确保某 ...

  7. 单例模式简单解析--Singleton 单例模式(懒汉方式和饿汉方式)

    单例模式的概念: 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 关键点: 1)一个类只有一个实例       这是最基本 ...

  8. Java Singleton 单例模式

    大家可能还听过 Singleton  也就是单例模式 这个单例模式要求 在程序的运行时候   一个程序的某个类 只允许产生一个 实例 那么 这个类就是一个单例类 Java Singleton模式主要作 ...

  9. 【转】Singleton单例模式

    对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务:一个系统只能有一个窗口管理器或文件系统:一个系统只能有一个计时工具或ID(序号)生成器. ...

随机推荐

  1. Extjs locked无效,使用enableLocking即可

    一.前言 在使用 extjs 做表格时,由于表格的列太多,我们需要设置一些固定列来查看数据,所以我们需要用到 locked 属性.普通加载 columns 的列是有效的,如果是动态加载的话,使用 lo ...

  2. Python3实现自动查询成绩(主要使用的包有Tesseract-OCR、PIL、execjs、pytesseract、BeautifulSoup)

    前提:本文仅作为技术训练,不可利用技术做非法的事. 某考试的成绩查询页面如下:查询成绩需要的数据有准考证号或者身份证.考生姓名.验证码.现在使用python来实现自动查询指定人员的考试成绩(不知道准考 ...

  3. JAVA 后台面试之操作系统问题集锦

    1.进程和线程以及他们的区别 2.进程间通信的几种方式 3.线程同步的方式 4.死锁 5.分页和分段有什么区别?(内存管理) 6.操作系统中进程调度的策略有哪几种? 7.页面置换算法: 8.系统颠簸 ...

  4. 关于 Visual Studio 的代码度量值

    查看方式:Visual Studio -> Analyze -> Calculate code metrics feature 代码度量(Code Metrics)是用来测量专业标准的软件 ...

  5. python基础学习(十一)

    22.类 # 类 class # 实例 实体 instance class Student: # 空语句 保持结构的完整性 pass jack = Student() jack.name = &quo ...

  6. JDBC ORM(Object Relationship Database Mapping)

    ORM=Object Relationship Database Mapping 对象和关系数据库的映射 简单说,一个对象,对应数据库里的一条记录 示例:根据id返回一个Hero对象 提供方法get( ...

  7. 微信公众号h5页面自定义分享

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  8. Shiro简介、入门案例、web容器的集成

    目的: shiro简介 Shiro入门案例 Shiro与web容器的集成 shiro简介(中文官网:https://www.w3cschool.cn/shiro/andc1if0.html) 1.什么 ...

  9. Mock常用占位符一览

    1.随机字符串(类型 , 位数)@string(lower,10) lower : 小写字母upper : 大写字母number : 数字 2.随机int(下限 , 上限)@integer(60, 1 ...

  10. 开源微信小程序商城测评

    1. Java版 1)微同商城 减少重复造轮子,开源微信小程序商城 .快速搭建一个属于自己的微信小程序商城. 官网地址:https://fly2you.cn 开源地址:https://gitee.co ...