黑马程序员-----关于懒汉式和饿汉式小结
来源:互联网 发布:python import thread 编辑:程序博客网 时间:2024/05/22 07:40
--------android培训、java培训、期待与您交流! ----------
今天学习到单例的设计模式这一节,感觉理解起来有点绕,所以在此做一下总结。
概念:
java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。单例模式有一下特点:
1、单例类只能有一个实例。
2、单例类必须自己自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。
饿汉式:
class single(
private static single s= new single();
private single(){}
public static single getInstance()
{
return s;
}
)
先初始化对象 single类一进内存就已经创建好了对象,饿汉式其实是一种比较形象的称谓。既然饿,那么在创建对象实例的时候就比较着急,饿了嘛,于是在装载类的时候就创建对象实例。
private static single s= new single();
饿汉式是典型的空间换时间,当类装载的时候就会创建类的实例,不管你用不用,先创建出来,然后每次调用的时候,就不需要再判断,节省了运行时间。
懒汉式:
class single
{ private static single s = null;
private single(){}
public static single getInstance()
{if (s == null)
s = new single();
return s ;
}
}
对象是方法被调用时才被初始化,也叫做对象的延时加载
single类进内存,对象还没有存在,只有调用了getInstance方法时才建立对象
懒汉式是典型的时间换空间,就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。当然,如果一直没有人使用的话,那就不会创建实例,则节约内存空间
由于懒汉式的实现是线程安全的,这样会降低整个访问的速度,而且每次都要判断。那么有没有更好的方式实现呢?
这时候可以使用“双重检查加锁”的方式来实现,就可以既实现线程安全,又能够使性能不受很大的影响。那么什么是“双重检查加锁”机制呢?
所谓“双重检查加锁”机制,指的是:并不是每次进入getInstance方法都需要同步,而是先不同步,进入方法后,先检查实例是否存在,如果不存在才进行下面的同步块,这是第一重检查,进入同步块过后,再次检查实例是否存在,如果不存在,就在同步的情况下创建一个实例,这是第二重检查。这样一来,就只需要同步一次了,从而减少了多次在同步情况下进行判断所浪费的时间。
“双重检查加锁”机制的实现会使用关键字volatile,它的意思是:被volatile修饰的变量的值,将不会被本地线程缓存,所有对该变量的读写都是直接操作共享内存,从而确保多个线程能正确的处理该变量。
以上是对今天学习内容的小结,内容比较片面。希望大家指正。
- 黑马程序员-----关于懒汉式和饿汉式小结
- 黑马程序员_面试之懒汉式和饿汉式小结
- 黑马程序员 - Java 懒汉式和饿汉式
- 黑马程序员—懒汉式和饿汉式
- 黑马程序员 关于单例模式、懒汉式、饿汉式
- 黑马程序员-单例设计模式:懒汉式和饿汉式
- 黑马程序员-单例设计模式:“饿汉式”和“懒汉式”
- 黑马程序员——java小结_007_单例设计模式(懒汉式、饿汉式)
- 黑马程序员--懒汉式和饿汉式单例设计模式
- 黑马程序员_Singleton模式(单例模式)饿汉式和懒汉式
- 黑马程序员——java中关于单例设计模式和懒汉式多调用的问题
- 黑马程序员——单例(懒汉式+饿汉式)
- 黑马程序员_专题:单例复习(懒汉式,饿汉式)
- 黑马程序员_单例设计模式(饿汉式&懒汉式)
- 黑马程序员--懒汉式(面试题)
- 黑马程序员———单例设计模式-懒汉式关于线程安全以及要点
- 饿汉式和懒汉式
- 黑马程序员--单例设计模式的笔记(懒汉式,饿汉式)
- 大家好,来露个脸。
- 各种日期转换
- 使用mod_rewrite优化seo
- 题目1070 今年的第几天? 九度Online Judge
- One Cause of java.net.SocketTimeoutException: Read timed out
- 黑马程序员-----关于懒汉式和饿汉式小结
- poj2481
- Eclipse导入Myeclipse的web项目
- erlang 游戏服务器 缓存
- 几种对整数处理的函数 通用的
- JavaScript表单对象Form介绍
- C# Datagridview 获取COmbobox列的text值
- 未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage”包
- 观察者模式:推模式和拉模式