您的位置:首页 > 其它

单例模式(懒)写法整理(改之前标题“最佳写法”)

2016-03-28 14:29 288 查看
转载请标明出处:

/article/7703809.html

本文出自: 【温利东的博客】

之所以想写这个问题,是因为之前网上很多都是这样的代码:

private static MyApplication instance;
public static MyApplication getInstance() {
if (instance == null) {
instance = new MyApplication();
}
return instance;
}


这种写法线程不安全,改进一下,加一个同步锁(双重校验):

private static MyApplication instance;
public static MyApplication getInstance() {
if (instance == null) {
synchronized (MyApplication.class) {
if (instance == null) {
instance = new MyApplication();
}
}
}
return instance;
}


网上这样的代码更多,可以很好的工作,这种方式可以很好的降低同步锁的开销,但会出现 当线程A和B 执行时,B线程将看到一个还没有被初始化的对象的问题。




实际上,早在JDK1.5就引入volatile关键字,所以又有了一种更好的双重校验锁写法:

private volatile static MyApplication instance;
public static MyApplication getInstance() {
if (instance == null) {
synchronized (MyApplication.class) {
if (instance == null) {
instance = new MyApplication();
}
}
}
return instance;
}


好处:

1.通过双重检查锁定来降低同步的开销;

2.保证多线程并发执行,采用
volatile
不会出现第二种方法说的那个问题.

还有一种写法:

class Foo {
private static class HelperHolder {
public static final MyApplication helper = new MyApplication();
}

public static MyApplication getHelper() {
return HelperHolder.helper;
}
}


内部类能使之 延迟初始化(lazy initialization),并且多线程安全,还能保证高性能。

不是说第一、二种写法有问题,或者在Android中一定要用第三或第四种写法,只是告诉大家有更好的写法。

以上就是我的一点小小记录,希望对你有所帮助。

转载请标明出处:

/article/7703809.html

本文出自: 【温利东的博客】

参考:http://www.infoq.com/cn/articles/double-checked-locking-with-delay-initialization

http://www.ibm.com/developerworks/java/library/j-jtp06197/index.html

http://wiki.jikexueyuan.com/project/java-concurrency/synchronized-and-volatile.html

http://www.race604.com/java-double-checked-singleton/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: