单例模式--java15(11/12/2015)

设计模式:设计模式是在大量的实践中总结和理论化后优选的代码结构、编程风格、以及解决问题的思考方式。

一共有23种设计模式。

单例的设计模式:

1、解决的问题:使得一个类只能够创建一个对象。

2、如何实现?见如下四步

//饿汉式1

public class TestSingleton {

public static void main(String[] args) {

      Singleton s1 = Singleton.getInstance();

      Singleton s2 = Singleton.getInstance();

      System.out.println(s1 == s2);//true,说明这两个引用的地址是一样的

}

}

//只能创建Singleton的单个实例

class Singleton{

//1、私有化构造器,使得在类的外部不能够调用此构造器

private Singleton(){

}

//2、在类的内部创建一个类的实例

//3、私有化此对象,通过公共的方法来调用

private static Singleton instance = new Singleton();

//4、此公共的方法,只能通过类来调用,因为设置为static的,同时类的实例也必须为static声明的

public static Singleton getInstance(){

return instance;

}

}

//饿汉式2

...   ...

//2、在类的内部创建一个类的实例,与1的区别是是通过代码块实例化类的。

private static Singleton instance = null;

static {

instance = new Singleton();

}



//懒汉式:可能存在线程安全问题

public class TestSingleton1 {

public static void main(String[] args) {

Singleton1 s1 = Singleton1.getInstance();

Singleton1 s2 = Singleton1.getInstance();

System.out.println(s1 == s2);//true

}

}

class Singleton1{

//1.

private Singleton1(){

}

//2.

private static Singleton1 instance = null;

//3.

public static Singleton1 getInstance(){

if (instance == null){

instance = new Singleton1();

}

return instance;

}

}

为什么懒汉式可能存在线程安全问题?

因为假如有多个执行路径在调用getinstance()方法,当第一个执行路径由于首次执行getinstance方法,instance==null,进入if循环,但是由于当前执行的路径比较多,进行了CPU切换,该进程被挂起。另外一个执行路径开始执行,此时依旧instance==null,然后创建了instance对象(0x1111),返回instance;然后切换到第一个执行路径继续执行,便接着new一个新的对象(0x2222);但是这两个引用本身应该指向同一个对象,此时便出现线程问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,896评论 18 399
  • 前言 本文主要参考 那些年,我们一起写过的“单例模式”。 何为单例模式? 顾名思义,单例模式就是保证一个类仅有一个...
    tandeneck阅读 7,216评论 1 8
  • 1 场景问题# 1.1 读取配置文件的内容## 考虑这样一个应用,读取配置文件的内容。 很多应用项目,都有与应用相...
    七寸知架构阅读 11,773评论 12 68
  • 一、 1、请用Java写一个冒泡排序方法 【参考答案】 public static void Bubble(int...
    独云阅读 5,238评论 0 6
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 5,385评论 0 3