美文网首页
单例模式和多线程

单例模式和多线程

作者: 白书黑影 | 来源:发表于2017-07-23 19:59 被阅读8次

单例模式是23个设计模式中比较简单,也是最常用的模式之一,虽然简单,但在多线程并发访问时如果不注意一些使用细节,会引发意想不到的bug。

## 单例模式

定义:保证一个类只有一个实例,并且自行实例化并向整个系统提供这个实例。

类图:待完成

优点:

* 减少内存开支

* 减少性能开销

* 避免对资源的多重占用

* 提供和共享全局访问量

缺点:

* 扩展性差

* 测试不方便

* 单例模式和单一职责莫设计原则向冲突

单例的变相形式

## 饿汉模式

```java

public class EagerSingleton {

private static EagerSingleton singleton=new EagerSingleton();

private EagerSingleton(){

}

public static EagerSingleton getSingleton(){

return singleton;

}

}

```

## 懒汉模式

该代码采用了DCL双锁检测(double checked locking),避免了因为多线程并发下可能出现的异常

```java

public class LazySingleton {

private volatile static LazySingleton singleton;

private LazySingleton(){

}

public static LazySingleton getSingleton() throws InterruptedException {

if (singleton != null) {

} else {

Thread.sleep(3000);

synchronized (LazySingleton.class) {

if (singleton == null) {

singleton = new LazySingleton();

}

}

}

return singleton;

}

}

```

测试类:

```java

public class MyThread extends Thread{

@Override

public void run() {

super.run();

System.out.println("EagerSingleton"+EagerSingleton.getSingleton().hashCode());

try {

System.out.println("LazySingleton"+LazySingleton.getSingleton().hashCode());

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

public class Test {

public static void main(String[] args) {

MyThread t1=new MyThread();

MyThread t2=new MyThread();

MyThread t3=new MyThread();

MyThread t4=new MyThread();

t1.start();

t2.start();

t3.start();

t4.start();

}

}

```

## 运行结果

```java

EagerSingleton908288934

EagerSingleton908288934

EagerSingleton908288934

EagerSingleton908288934

LazySingleton1515217202

LazySingleton1515217202

LazySingleton1515217202

LazySingleton1515217202

```

可以看到hash值相同,证明了我们的结论,试着把双重检查中的判空代码去掉,再运行下结果,你会发现单例失效了!

相关文章

  • Java多线程--并行模式与算法

    Java多线程--并行模式与算法 单例模式 虽然单例模式和并行没有直接关系,但是我们经常会在多线程中使用到单例。单...

  • 单例模式

    单例模式介绍 把单例模式放到多线程基础这块,是因为单例和多线程有一点的关系。何为单例模式? 在它的核心结构中只包含...

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

  • Unity3d游戏开发之-单例设计模式-多线程一

    单例模式3:多线程一

  • 单例模式

    单例模式 单例模式:用来保证一个对象只能被创建一次。 普通版 代码实现如下 同步锁单例 单例模式如果再多线程中使用...

  • 多线程(下)&GUI

    day25(多线程(下)&GUI) 1_多线程(单例设计模式)(掌握) 单例设计模式:保证类在内存中只有一个对象。...

  • 设计模式——单例模式的破坏

    概述: 之前学习了单例模式的几种实现,解决了多线程情况下,单例的线程安全问题,保证了单例的实现。但是单例模式在下面...

  • iOS 多线程NSThread,GCD,NSOperation

    单例模式例子: https://github.com/XiaoRuiZuo/Singleton 多线程:多线程是为...

  • day25-多线程/Timer/单例模式/工厂模式/GUI

    25.01_单例设计模式(掌握) 单例设计模式:保证类在内存中只有一个对象。 25.02_多线程(Runtime类...

  • 25.01_多线程(单例设计模式)

    ###25.01_多线程(单例设计模式)(掌握) * 单例设计模式:保证类在内存中只有一个对象。 * 如何保证类在...

网友评论

      本文标题:单例模式和多线程

      本文链接:https://www.haomeiwen.com/subject/yqgmkxtx.html