单例
2013-11-18 17:24
267 查看
单例模式有一下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
它到底能带给我们什么好处呢?其实无非是三个方面的作用:
1、控制资源的使用,通过线程同步来控制资源的并发访问。
2、控制实例产生的数量,有利于Java垃圾回收(garbage collection:System.gc(); Runtime.getRuntime.gc();),达到节省内存的目的。
3、作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程之间实现通信。
懒汉式:对象延迟加载。
思路:类存在时内部没有对象,只有当调用方法时才会在类中建立对象(有多懒)。
然后这个是基本懒汉式的代码:
[java] view
plaincopyprint?
class Single
{
private static Single s= null;
private Single(){}
public static Single getInstance()
{
if(s== null)
s= new Single();
return s;
}
}
下面是安全的懒汉式代码:
[java] view
plaincopyprint?
class Single
{
private static Single s= null;
private Single(){}
public static Single getInstance()
{
if(s== null)
{
synchronized(Single.class)
{
if(s== null)
{
s= new Single();
}
}
}
return s;
}
}
饿汉式:
public class Singleton {
/**jvm保证instance只被初始化一次*/
private static final Singleton instance = new Singleton();
/**阻止外部使用new实例化对象*/
private Singleton(){
}
}
区别:
饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变
懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
它到底能带给我们什么好处呢?其实无非是三个方面的作用:
1、控制资源的使用,通过线程同步来控制资源的并发访问。
2、控制实例产生的数量,有利于Java垃圾回收(garbage collection:System.gc(); Runtime.getRuntime.gc();),达到节省内存的目的。
3、作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程之间实现通信。
懒汉式:对象延迟加载。
思路:类存在时内部没有对象,只有当调用方法时才会在类中建立对象(有多懒)。
然后这个是基本懒汉式的代码:
[java] view
plaincopyprint?
class Single
{
private static Single s= null;
private Single(){}
public static Single getInstance()
{
if(s== null)
s= new Single();
return s;
}
}
下面是安全的懒汉式代码:
[java] view
plaincopyprint?
class Single
{
private static Single s= null;
private Single(){}
public static Single getInstance()
{
if(s== null)
{
synchronized(Single.class)
{
if(s== null)
{
s= new Single();
}
}
}
return s;
}
}
饿汉式:
public class Singleton {
/**jvm保证instance只被初始化一次*/
private static final Singleton instance = new Singleton();
/**阻止外部使用new实例化对象*/
private Singleton(){
}
}
区别:
饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变
懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的
相关文章推荐
- HBASE学习笔记--shell
- QTP脚本不能录制怎么办?
- 全局键盘钩子(WH_KEYBOARD)
- 一张图让你看懂各开源License
- 开始我的技术学习之旅
- C++ 回忆录11 Template
- Android NDK 学习
- ZipBeginFileEvent.class
- MySQL Server 5.0绿色版安装方法图文教程
- JAVA容器 (自己的学习笔记)
- C++中构造函数和析构函数避免调用虚函数的问题
- iOS 设置音频倍速播放
- Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别
- 实现软件自动升级
- 成吉思汗灭西夏
- C++ std lib study1
- crontab小节2则:①crontab运行失败;②shell批量管理crontab
- Activity四种加载模式
- java的InputStream和OutputStream的理解【转】
- my.cnf /my.ini常用的一些服务端参数