黑马程序员技术交流社区
标题:
单例模式
[打印本页]
作者:
☆╰學不会☆╮
时间:
2013-10-23 20:39
标题:
单例模式
本帖最后由 ☆╰學不会☆╮ 于 2013-10-24 08:00 编辑
单例模式挺容易听懂的 但是就是延迟加载 懒汉式的单例。synchronized不是很理解。
public class SingerDemo {
// 私有的构造方法
private SingerDemo() {}
//静态私有的成员变量
private static SingerDemo instance = null;
public static SingerDemo getInstance() {
if (instance == null) {
synchronized (SingerDemo.class) {
if (null == instance) {
instance = new SingerDemo();
}
}
}
return instance;
}
}
谁能给解释一下 synchronized 跟多线程中的作用一样吗。
是不是 不加synchronized会导致对线程的访问不安全?
还有就是 两个if的作用? 谢了。。
作者:
卜弦
时间:
2013-10-23 21:05
synchronized 英语释义为:同步的。
多线程中,多个线程同时工作,如果几个线程操作同一个数据资源,由于cpu的执行的随机性特点,会使同一个数据被操作多次,给数据的操作但来安全隐患。
这是就需要对线程的操作进行同步,使每一次只能有一个线程在操作数据资源,从而保证结果的可靠性。因此线程的同步在JDK1.5之前就需要用到同步代码块
或者同步函数,单例设计里面用到的就是同步代码块,就是为了保证多线程下结果的唯一性和可靠性,所以synchronized在此作用是一样的。
由于语句中synchronized的加入使得每次线程进入代码块之前都要进行判断,该判断比较麻烦比较耗费CPU资源,使执行效率降低,为了较少同步代码块的判断次数
加入了第一个if (instance == null),即如果对象已经建立便不再进入内部去判断同步中的“锁”。把复杂的判断变为简单的判断,提高CPU执行效率。
第二个if (null == instance) 是判断对象有没有建立,没有的话就执行new SingerDemo();建立对象。
作者:
寻丶丶觅
时间:
2013-10-23 21:05
public class SingerDemo {
// 私有的构造方法
private SingerDemo() {}
//静态私有的成员变量
private static SingerDemo instance = null;
public static SingerDemo getInstance() {
//判断第一次是否为空,如果已经创建有对象,就可以跳过同步,提高效率
if (instance == null) {
synchronized (SingerDemo.class) {
if (null == instance) {
//加同步是怕多线程操作时,某一线程读到这一步挂掉,导致多个线程已经判断过instance是null.结果就会导致会创建两个或多个新的对象
instance = new SingerDemo();
}
}
}
return instance;
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2