前言:
懒汉式和饿汉式都是单例模式的实现方式。 懒汉式是指在需要使用实例时才会创建,而不是在类加载时就创建。懒汉式的实现方式有多种,其中最常见的是双重检查锁定(Double-Checked Locking)和静态内部类(Static Inner Class)。 双重检查锁定的实现方式是在getInstance方法中进行两次判空,第一次判空是为了避免不必要的同步,第二次判空是为了确保只有一个实例被创建。这种方式可以保证线程安全,同时也能够延迟实例的创建,但是在某些情况下会出现问题,例如在多线程环境下可能会出现指令重排的问题。 静态内部类的实现方式是利用了类加载器的机制,保证了线程安全和延迟实例的创建。在这种方式中,只有在getInstance方法第一次被调用时,才会加载SingletonHolder类,从而创建实例。由于类加载器的机制,SingletonHolder类只会被加载一次,因此保证了线程安全。 饿汉式是指在类加载时就创建实例,因此在多线程环境下也能够保证线程安全。饿汉式的实现方式比较简单,只需要在类中定义一个静态实例,并在静态代码块中进行初始化即可。这种方式的缺点是无法延迟实例的创建,因此可能会浪费一些资源。
总结:
懒汉式代码:
package mystudy.danlimoshi;
public class lanhanshi {
public static void main(String[] args) {
//System.out.println();
cat.getInstance();
System.out.println(cat.getInstance());
}
}
class cat
{
private String name;
private static cat mycat;
//1.定义一个静态属性对象
//提供一个公共的public的static方法
private cat(String name) {
this.name = name;
}
public static cat getInstance()
{
if(mycat==null)
{
mycat=new cat("小猫");
}
return mycat;
}
@Override
public String toString() {
return "cat{" +
"name='" + name + '\'' +
'}';
}
}
饿汉式:
package mystudy.danlimoshi;
public class danli {
public static void main(String[] args) {
gril instance=gril.getGr();
System.out.println(instance);
}
}
class gril
{
private String name;
private static gril gr=new gril("小红");
private gril(String name) {
this.name = name;
}
public static gril getGr() {
return gr;
}
@Override
public String toString() {
return "gril{" +
"name='" + name + '\'' +
'}';
}
}