`
abcxo
  • 浏览: 33296 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java——单例模式(singleton)

阅读更多

1.单例模式(singleton)

 

例如:

 

class Soup1{

private Soup(){}

public static Soup1 makeSoup(){

return new Soup1();

}

 

 这个不是单例模式,这个是对象受限创建,只需要简单的加入一下判断,即可是对象创建控制在需要的范围内,

 例如

 

class Soup1{

private Soup(){}

private static int i;

 

public static Soup1 makeSoup(){

if(i<10){ //这里就使对象创建次数控制在10次以内

return new Soup1();

i++;

}

}

 

}

这个对象受限创建的好处有控制对象,减少资源开销,与滥用等等

 

单例模式

class Soup2{

private Soup2(){}

private static Soup2 ps1=new Soup2();

public static Soup2 access(){

return ps1;

}

}

 

好处:是处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回(garbage collection)。利用资源共享等,具体再详细查,迟点补充

 

 

 

 

 

 

 

注:java的几种单例模式  http://blog.sina.com.cn/s/blog_3f9f7e71010139tq.html

 

各种创建单例模式的优缺点

 (2012-03-13 17:40:59)
标签: 

杂谈

分类: CoreJava

单例模式应用于一个类只有一个实例的情况,并且为其实例提供一个全局的访问点。

特点

1.一个类只有一个实例

2.自己创建这个实例

3.整个系统只能用这个实例

应用场景

外部资源:每台计算机有若干个打印机,但只能有一个PrinterSpooler,以避免两个打印作业同时输出到打印机。

内部资源:大多数软件都有一个(或多个)属性文件存放系统配置,这样的系统应该有一个对象管理这些属性文件。

实现方式

1.饿汉式:单例实例在类装载时就构建,急切初始化。(预先加载法)

public class Singleton1 { private Singleton1() { } public static Singleton1 instance = newSingleton1(); public Singleton1 getInstance() { return instance; } }

优点 1.线程安全
2.在类加载的同时已经创建好一个静态对象,调用时反应速度快
缺点 资源效率不高,可能getInstance()永远不会执行到,但执行该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化

 

2.懒汉式:单例实例在第一次被使用时构建,延迟初始化。

class Singleton2 { private Singleton2() { } public static Singleton2 instance = nullpublicstatic Singleton2 getInstance() { if (instance == null) {
//多个线程判断instance都为null时,在执行new操作时多线程会出现重复情况 instance = new Singleton2(); } return instance; } }

懒汉式在单个线程中没有问题,但在多线程就可能会出现两个或多个Singleton2实例情况,

虽然后面实例化的Singleton2会覆盖前面实例化的Singleton2,但最好避免这样的情况。

改进方式就是加锁synchornized

class Singleton3 { private Singleton3() { } public static Singleton3 instance = nullpublicstatic synchronized Singleton3 getInstance() { if (instance == null) { instance = newSingleton3(); } return instance; } }
优点 资源利用率高,不执行getInstance()就不会被实例,可以执行该类的其他静态方法
缺点 第一次加载时不够快,多线程使用不必要的同步开销大


3.双重检测

class Singleton4 { private Singleton4() { } public static Singleton4 instance = nullpublicstatic Singleton4 getInstance() { if (instance == null) { synchronized (Singleton4.class) { if(instance == null) { instance = new Singleton4(); } } } return instance; } }

优点 资源利用率高,不执行getInstance()就不被实例,可以执行该类其他静态方法
缺点 第一次加载时反应不快,由于java内存模型一些原因偶尔失败

 

4.静态内部类

class Singleton5 { private Singleton5() { } private static class SingletonHelp { static Singleton5 instance = new Singleton5(); } public static Singleton5 getInstance() { returnSingletonHelp.instance; } }

优点 资源利用率高,不执行getInstance()不被实例,可以执行该类其他静态方法
缺点 第一次加载时反应不够快

 

总结:一般采用饿汉式(1),若对资源十分在意可以采用静态内部类(4),不建议采用懒汉式及双重检测(2、3)

另外

对于第二种可以采用volatile方式

volatile用更低的代价代替同步

解释:同步的代价主要有覆盖范围决定,如果可以降低同步的覆盖范围,可大幅提升性能。

而volatile覆盖范围是变量级别的,因此同步代价很低。

volatile原理:告诉处理器,不要将其放入工作内存,而是直接在主存操作。因此,当多处理器或多线程在访问该变量时

都将直接操作主存,这在本质上做到了变量共享。

volation优势:

1.更大的程度吞吐量

2.更少的代码实现多线程

3.程序伸缩性好

4.比较好理解,无需太高的学习成本

volatile不足:

1.容易出问题

2.比较难设计

 

 

 

 

0
0
分享到:
评论

相关推荐

    设计模式——单例模式

    **设计模式——单例模式** 在软件工程中,设计模式是一种在特定场景下解决常见问题的标准方案,可以被复用并提升代码质量。单例模式是设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式...

    设计模式——单例模式(懒汉模式)

    在Java中,懒汉式的单例模式通常通过双重检查锁定(Double-Check Locking,DCL)来实现,这是一种线程安全的方式。下面是一个简单的DCL实现的懒汉式单例模式代码示例: ```java public class Singleton { private ...

    java设计模式之——单例模式

    在Java中实现单例模式有多种方法,下面将详细探讨。 首先,最基础的实现方式是"饿汉式"单例,它在类加载时就完成了初始化,因此是线程安全的。代码如下: ```java public class Singleton { private static final...

    设计模式实现——单例模式

    在Java或其他面向对象的语言中,实现单例模式主要有两种方式:饿汉模式和懒汉模式。 1. **饿汉模式**: 饿汉模式在类加载时就完成了初始化,所以类加载比较慢,但获取单例的速度快,且线程安全。在Java中,通常...

    单例 模式 singleton

    Java枚举类型天然支持单例模式,既简单又线程安全: ```java public enum SingletonClass { INSTANCE; // 可以添加方法 } ``` 这种方式简洁且易于理解和维护,是推荐的单例实现方式。 总之,单例模式通过限制类...

    设计模式-单例模式

    **设计模式——单例模式** 单例模式是一种广泛应用于软件设计中的创建型设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于控制共享资源的访问,比如线程安全的数据库连接池...

    设计模式之单例模式Java实现和类设计图

    本次我们将深入探讨两种设计模式——单例模式和装饰模式,它们在Java编程中都有着广泛的应用。 首先,让我们来理解“单例模式”。单例模式是一种创建型设计模式,其核心思想是保证一个类只有一个实例,并提供一个...

    java设计模式-单例.pdf

    ### Java设计模式——单例模式详解 #### 一、单例模式概述 单例模式是设计模式中的一个重要组成部分,属于创建型模式之一。其主要作用是确保某个类仅有一个实例存在,并提供一个全局访问该实例的方法。这在很多场景...

    2种单例模式:1赖汉式:2饿汉式

    这里我们将详细探讨标题中提到的两种单例模式——"懒汉式"(Lazy Initialization)和"饿汉式"(Eager Initialization)。 1. **饿汉式单例模式** 饿汉式单例的特点是类加载时就完成了实例化,确保了线程安全,但...

    design-pattern-java.pdf

    工厂三兄弟之抽象工厂模式(二) 工厂三兄弟之抽象工厂模式(三) 工厂三兄弟之抽象工厂模式(四) 工厂三兄弟之抽象工厂模式(五) 单例模式-Singleton Pattern 确保对象的唯一性——单例模式 (一) 确保对象的...

    单例模式的几种实现方式

    枚举是Java中天然的单例模式,防止反射攻击,同时线程安全,推荐使用。 ```java public enum Singleton { INSTANCE; public void whateverMethod() { } } ``` 每种实现方式都有其适用场景,开发者应根据实际...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...

    软件设计模式实验报告

    本实验报告主要探讨了软件设计模式中的一个重要概念——单例模式。单例模式是一种常用的设计模式,它保证一个类只有一个实例,并提供一个全局访问点,使得其他对象能够共享这个唯一实例,从而有效地管理资源。 在...

    设计模式——单实例模式、单件模式——Java编写

    在Java中,实现单例模式主要有三种方式:饿汉式、懒汉式和双重检查锁定(DCL)。 1. 饿汉式: 饿汉式是在类加载时就完成了初始化,因此类加载比较慢,但获取实例的速度快,且线程安全。代码如下: ```java public...

    java精典编程100例 12

    本篇将重点探讨第12个例子——单例模式(Singleton Pattern)。单例模式是一种常用的软件设计模式,在大多数应用场景中,它能够确保一个类只有一个实例,并提供一个全局访问点。接下来,我们将详细解析单例模式的...

    单例模式(Singleton Pattern)

    单例模式是设计模式中的一种,它用于控制类的实例化过程,确保在整个应用程序中,对于特定类,只有一个实例存在。这种模式常被用来管理共享资源或者全局配置,以提高性能和减少系统间的耦合。 单例模式的核心在于...

    设计模式-Java语言中的应用(pdf)

    创建型模式如单例(Singleton)、工厂方法(Factory Method)和抽象工厂(Abstract Factory),主要关注对象的创建过程,使得代码更具灵活性和可扩展性。结构型模式如适配器(Adapter)、装饰器(Decorator)、代理...

    java设计模式(收集整理,学习笔记)

    下面将详细讨论在给定文件中提及的两种模式——单例模式和工厂模式。 ### 单例模式 单例模式确保一个类只有一个实例,并提供全局访问点。这种模式在资源管理、缓存、日志记录等方面非常有用。在Java中,单例模式有...

    \Java第四十一——四十二讲总结-设计模式.doc

    ### Java设计模式详解 #### 单例模式(Singleton Pattern)...通过上述介绍,我们了解了两种重要的设计模式——单例模式和观察者模式。这两种模式都有助于提高代码的可维护性和扩展性,是软件开发中不可或缺的一部分。

Global site tag (gtag.js) - Google Analytics