DCL问题请教

11-02-26 shijinkui

Class Foo
{
Private Resource res = null;
Public Resource getResource()
{
If (res == null)
{
       //只有在第一次初始化时,才使用同步方式.
synchronized(this)
{
if(res == null)
{
res = new Resource();
}
}
}
return res;
}
}
<p>

http://www.pusuo.net/2011-02-26/111303851.html

由于编译器优化了程序指令, 允许对象在构造函数未调用完前, 将 共享变量的引用指向 部分构造的对象, 虽然对象未完全实例化, 但已经不为null了.

==============================

这个共享变量引用是什么机制。请教

jdon007
2011-02-26 22:13
这个是单例模式“懒汉式”实现方式,采用互斥锁机制进行同步,避免多线程中可能出现重复创建的情景,但仍有可能出现未及时创建的情景。如果Resource占用的内存不是特别大,不妨使用“饿汉式”的实现方式,事先创建好资源,上述的问题可迎刃而解。

public class Resource {
	private static Resource resource = new Resource();

	private Resource() {		
	};

	public static Resource getResource() {
		return resource;
	}
}
<p>

oojdon
2011-02-26 22:17
2011年02月26日 21:32 "shijinkui"的内容
将 共享变量的引用指向 部分构造的对象, 虽然对象未完全实例化, 但已经不为null了. ...

用Happen-Before去分析。

SpeedVan
2011-02-27 19:43
同意两个楼上,真要懒汉的话,必须Happen-Before,java关键字volatile

猜你喜欢