剑指offer - 实现Singleton模式
2015-09-19 18:25
477 查看
由于只生成一个实例,因此需要将类的构造函数设为私有,然后生成实例的功能由它内部的函数去实现:
解法一:(只适用于单线程模式)在多线程情况下,下面的代码可能会因为有多个线程同时执行到 if 判断语句,然后同时创建了Singleton的多个实例,从而破坏了单例模式。
针对上述多线程的问题,我们需要对上述代码进行加锁处理。当一个线程在创建实例的时候,其他线程只能的等待。代码如下所示:
分析上述代码,假设当前有两个线程想同时创建一个实例,由于在一个时刻只有一个线程能得到同步锁,当第一个线程加上锁时,第二个线程只能等待,并由第一个线程创建出一个实例。创建之后第一个线程释放同步锁,此时第二个线程可以加上同步锁,并运行接下来的代码。由于加上同步锁后第二个线程会发现当前已经有了一个Singleton对象了,于是便不会再重复创建Singleton的实例,从而保证了单例模式。
解法一:(只适用于单线程模式)在多线程情况下,下面的代码可能会因为有多个线程同时执行到 if 判断语句,然后同时创建了Singleton的多个实例,从而破坏了单例模式。
class Singleton{ private static Singleton single = null; private Singleton(){ } public static Singleton getSingletonObject(){ if ( single == null ) { single = new Singleton(); } return single; } }
针对上述多线程的问题,我们需要对上述代码进行加锁处理。当一个线程在创建实例的时候,其他线程只能的等待。代码如下所示:
class Singleton{ private static Singleton single = null; private static Object syncObj = new Object(); public static Singleton getSingletonObject(){ if ( single == null ){ lock(syncObj){ if ( single == null ) single = new Singleton(); } } return single; } }
分析上述代码,假设当前有两个线程想同时创建一个实例,由于在一个时刻只有一个线程能得到同步锁,当第一个线程加上锁时,第二个线程只能等待,并由第一个线程创建出一个实例。创建之后第一个线程释放同步锁,此时第二个线程可以加上同步锁,并运行接下来的代码。由于加上同步锁后第二个线程会发现当前已经有了一个Singleton对象了,于是便不会再重复创建Singleton的实例,从而保证了单例模式。
相关文章推荐
- html 使得两个元素 左右并排垂直居中对齐的最好方法是用 span 标签把他们都包起来。
- 如何使用Ubuntu online account API创建微博HTML5申请书
- Arcgis for Javascript之featureLayer图和属性互操作性
- jquery Ajax的load、post、get、put、delete的用法
- js关闭浏览器窗口及检查浏览器关闭事件
- FlatBuffers小试
- HTML绝对路径和相对路径
- Ember.js 入门指南——{{link-to}} 助手
- 由JQuery到Angularjs的思维转变
- JavaScript的分号
- js表单验证
- js判断手机和pc端选择不同执行事件的方法
- 美团offer
- JavaScript 正则match的使用体会
- JavaScript简史和概述
- 包含min函数的栈(剑指offer+新概念题)模拟
- “jquery于each方法和选择”学习笔记
- 乌拉姆螺旋(Ulam Spiral)的实验图片及一段HTML代码
- 关于JavaScript中替换字符串需要注意的问题
- html中的图片格式