Java设计模式之单例模式
来源:互联网 发布:大数据涂子沛书籍下载 编辑:程序博客网 时间:2024/05/17 04:19
饿汉式单例
class MySingleton2 { private static MySingleton2 mySingleton2 = new MySingleton2(); private MySingleton2() { } public static MySingleton2 getInstance(){ return mySingleton2; }}
饿汉式单例不存在线程安全问题:
public class Singleton { public static void main(String[] args) { for (int i = 0; i < 10; i++) { new Thread(new Runnable() { @Override public void run() { System.out.println(MySingleton2.getInstance().hashCode()); } }).start(); } }}
运行结果:
懒汉式单例
class MySingleton1 { private static MySingleton1 mySingleton1 = null; private MySingleton1() { } public static MySingleton1 getInstance() { if (mySingleton1 == null) { mySingleton1 = new MySingleton1(); } return mySingleton1; }}
存在线程安全问题:
public class Singleton { public static void main(String[] args) { for (int i = 0; i < 10; i++) { new Thread(new Runnable() { @Override public void run() { System.out.println(MySingleton1.getInstance().hashCode()); } }).start(); } }}
运行结果:
改进方式1:使用同步方法或者同步块
class MySingleton1 { private static MySingleton1 mySingleton1 = null; private MySingleton1() { } public static synchronized MySingleton1 getInstance() { if (mySingleton1 == null) { mySingleton1 = new MySingleton1(); } return mySingleton1; }}
class MySingleton1 { private static MySingleton1 mySingleton1 = null; private MySingleton1() { } public static MySingleton1 getInstance() { synchronized (MySingleton1.class) { if (mySingleton1 == null) { mySingleton1 = new MySingleton1(); } } return mySingleton1; }}
可以解决,运行结果如下:
但是效率太低。
改进方式2:使用同步块锁定核心代码
class MySingleton1 { private static MySingleton1 mySingleton1 = null; private MySingleton1() { } public static MySingleton1 getInstance() { if (mySingleton1 == null) { synchronized (MySingleton1.class) { mySingleton1 = new MySingleton1(); } } return mySingleton1; }}
不能解决问题,运行结果如下:
改进方式3:使用双检查锁机制(推荐)
class MySingleton1 { private static MySingleton1 mySingleton1 = null; private MySingleton1() { } public static MySingleton1 getInstance() { if (mySingleton1 == null) { synchronized (MySingleton1.class) { if (mySingleton1 == null) { mySingleton1 = new MySingleton1(); } } } return mySingleton1; }}
可以解决线程安全问题,并且效率较高,运行结果如下:
0 0
- java设计模式之单例模式
- Java模式设计之单例模式
- Java模式设计之单例模式
- Java模式设计之单例模式
- java设计模式之单例模式
- Java模式设计之单例模式
- Java模式设计之单例模式
- Java设计模式之单例模式
- Java设计模式之单例模式
- Java设计模式之单例模式
- Java设计模式之单例模式
- Java模式设计之单例模式
- java设计模式之单例模式
- java设计模式之单例模式
- java设计模式之单例模式
- java设计模式之单例模式
- java设计模式之单例模式
- java设计模式之单例模式
- Effective Java 读书笔记(7)避免finalizer
- 视频会议red5
- 8086汇编5:更灵活的寻址方式
- BZOJ 1369 树形DP
- Numpy array 分割
- Java设计模式之单例模式
- Spring Framework所需的构建
- BZOJ 3674/BZOJ 3673 主席树
- 只定义了加法的大数类
- 57. Insert Interval
- 【PAT】1021. Deepest Root
- BZOJ 1786 DP
- BZOJ 4321 DP
- c语言位操作