package thread_Demo;
class SingleInstance implements Runnable
{
/*
* 饱汉式单例模式
* */
private static SingleInstance s = null;
private SingleInstance(){}
public static SingleInstance get_Instance()
{
if (s == null)
{
synchronized (SingleInstance.class) { // 注意:这是个知识点!!由于静态代码区没有this指针,但是java中这些代码块任然是封装在一个
<span style="white-space:pre"> </span> // 对象中,这个对象的地址是SingleInstance.class.
<span style="white-space:pre"> </span> // 在自己写 的非静态函数中这里既是this
if (s == null)
s = new SingleInstance();
return s ;
}
}
return s ;
}
public void run()
{
System.out.println(Thread.currentThread().getName()+"........"+ SingleInstance.get_Instance());
}
}
public class Thread_SingleInstanceDemo {
/**
* 本程序演示多线程模式下的单例访问模式
*/
public static void main(String[] args) {
SingleInstance s1 = SingleInstance.get_Instance();
Thread t1 = new Thread(s1);
Thread t2 = new Thread(s1);
Thread t3 = new Thread(s1);
t1.start();
t2.start();
t3.start();
}
}
饱汉式单例模式
假设1线程最想执行,判断为null后拿到锁,这时线程1停下了,线程2获得了执行权,此时判断为null后,但是得不到锁,就不能获得创建对象的权利,从而保证了单例的正确性!!
下面看饿汉式单例
private static final SingleInstance s = new SingleInstance ();
由于这一句中final的存在就保证了不会有其他的进程可以修改第一个进程创建的地址