之所以想写这个问题,是因为之前网上很多都是这样的代码:
这种写法线程不安全,改进一下,加一个同步锁(双重校验):
网上这样的代码更多,可以很好的工作,这种方式可以很好的降低同步锁的开销,但会出现 当线程A和B 执行时,B线程将看到一个还没有被初始化的对象的问题。
。
实际上,早在JDK1.5就引入volatile关键字,所以又有了一种更好的双重校验锁写法:
好处:
1.通过双重检查锁定来降低同步的开销;
2.保证多线程并发执行,采用 volatile
不会出现第二种方法说的那个问题.
还有一种写法:
内部类能使之 延迟初始化(lazy initialization),并且多线程安全,还能保证高性能。
不是说第一、二种写法有问题,或者在Android中一定要用第三或第四种写法,只是告诉大家有更好的写法。
以上就是我的一点小小记录,希望对你有所帮助。
转载请标明出处:
http://blog.csdn.net/sinat_15877283/article/details/50997664;
本文出自: 【温利东的博客】
参考: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/;