标签:自己 资源 内存 遇见 无法 实现 使用 == 电脑系统
单例模式的定义:一个类只有一个实例,且该类能自行创建这个实例。(例子:电脑系统的任务管理器、回收站等)
单例模式的特点:
1.实现单例模式的类只有一个实例对象
2.该实例对象由单例类自己生成
3.单例类对外提供一个访问该单例的全局访问点
实现方式(一):真.懒汉模式
1 public class SingleTon { 2 // 1.自己创建对象,自给自足 3 private static SingleTon singleTon; 4 // 2.加上private让外部的其他类无法通过new创建对象,不给别人new 5 private SingleTon(){} 6 // 3.提供一个公共方法给外部,还是要给别人用 7 public static SingleTon getInstance(){ 8 if( singleTon == null){ 9 singleTon = new SingleTon(); 10 } 11 return singleTon; 12 } 13 }
懒汉模式顾名思义就是需要使用的时候发现没有才去创建,而这种方式并没有考虑线程安全的问题。如果存在多个线程同时来调用getInstance方法就会生成多个实例对象,所有真的很懒,最好别这样。
优点:需要的时候才创建,减少了内存的初始压力 缺点:遇见多线程的情况相当于没用
实现方式(二):常用.懒汉模式
1 public class SingleTon { 2 // 1.自己创建对象,自给自足 3 private static volatile SingleTon singleTon; 4 // 2.加上private让外部的其他类无法通过new创建对象,不给别人new 5 private SingleTon(){} 6 // 3.提供一个公共方法给外部,还是要给别人用 7 public static synchronized SingleTon getInstance(){ 8 if( singleTon == null){ 9 singleTon = new SingleTon(); 10 } 11 return singleTon; 12 } 13 }
懒汉模式常用的是这种类型的。通过关键字volatile和synchronized保证了在多线程的情况下也不掉链子,能够实现单例模式。
优点:同真.懒汉模式(这个倒是一脉相承)且线程安全 缺点:两个关键字保证了每次访问都需要同步,所以在性能上和资源消耗上要大一点
实现方式(三):饿汉模式
1 public class SingleTon { 2 // 1.自己创建对象 3 private static volatile SingleTon singleTon = new SingleTon(); 4 // 2.加上private让外部的其他类无法通过new创建对象,不给别人new 5 private SingleTon(){} 6 // 3.提供一个公共方法给外部,还是要给别人用 7 public static synchronized SingleTon getInstance(){ 8 return singleTon; 9 } 10 }
饿汉模式理解就是饿,有吃的跑的快,所以一上来就生成了实例对象,先捞到手再说,需要的时候直接用就行。
优点:因为是类一加载就创建了唯一实例对象,所以想通过多线程搞事情就没机会了 缺点:一开始就加载到内存中,如果用的时候很晚会存在资源浪费
标签:自己 资源 内存 遇见 无法 实现 使用 == 电脑系统
原文地址:https://www.cnblogs.com/flyingorchid/p/12534647.html