Maison  >  Article  >  Java  >  Quelle est la différence entre le mode paresseux Java et le mode affamé ?

Quelle est la différence entre le mode paresseux Java et le mode affamé ?

WBOY
WBOYavant
2023-05-03 20:43:051591parcourir

Difference

1 Les gens paresseux sont paresseux et ne reviennent pour initialiser ce singleton que lorsque getInstance est appelé.

2. Une fois la classe chargée, l'homme affamé initialisera le singleton pour s'assurer que le singleton existe déjà lorsque getInstance est utilisé

Thread safety : #🎜🎜 #.

Le style chinois affamé est intrinsèquement thread-safe et peut être utilisé directement pour le multi-threading sans aucun problème

Le style paresseux lui-même n'est pas thread-safe (le verrouillage à double vérification résout les problèmes de concurrence)#🎜 🎜#

Chargement et performances des ressources :

Le style chinois affamé instancie un objet statique lors de la création de la classe. Que le singleton soit utilisé ou non à l'avenir, il occupera une certaine quantité de. mémoire, mais en conséquence, le premier appel sera également plus rapide puisque ses ressources sont déjà initialisées.

Style paresseux, qui retardera le chargement. L'objet instance n'apparaîtra que lorsque ce singleton est utilisé pour la première fois. Il doit être initialisé lorsqu'il est appelé pour la première fois. beaucoup de travail à faire, la performance sera un peu Delay, ce sera comme le style d'un homme affamé à l'avenir.

2, Exemple

public class SingleTon01 {
    public static void main(String[] args) {
        GirlFriend gf1 = GirlFriend.getGf();
        GirlFriend gf2 = GirlFriend.getGf();
        //true
        System.out.println(gf1 == gf2);
 
        Cat cat1 = Cat.getCat();
        Cat cat2 = Cat.getCat();
        //true
        System.out.println(cat1 == cat2);
    }
}
 
 
/**
 * 单例模式-饿汉模式
 * 在类加载的时候就会创建对象
 */
class GirlFriend {
    public String name;
 
    private static GirlFriend gf = new GirlFriend("小红");
 
    public static GirlFriend getGf() {
        return gf;
    }
 
    /**
     * 构造器私有化,不能在本类之外new
     * @param name
     */
    private GirlFriend(String name) {
        this.name = name;
    }
 
    @Override
    public String toString() {
        return "GirlFriend{" +
                "name='" + name + '\'' +
                '}';
    }
}
 
/**
 * 单例模式-懒汉模式
 * 1.构造器私有化
 * 2.提供一个static静态属性对象
 * 3.提供一个public的static方法,返回一个实例对象
 * 4.懒汉模式,只有在用户调用方法时,才会创建对象,之后再次调用,返回的是同一对象
 */
class Cat {
    private String name;
 
    private static Cat cat;
 
    private Cat(String name) {
        this.name = name;
    }
 
    public static Cat getCat() {
        if (cat == null) {
            cat = new Cat("加菲猫");
        }
        return cat;
    }
 
    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                '}';
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer