单例模式有以下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式又分很多种,必须饿汉式,懒汉式,登记式。
那么我们如何创建一个单例模式类,并且他也是线程安全的,我们首先想到的就是饿汉式,因为他是线程安全的
见以下代码
public class account {
private account(){
}
/*
* 创建一个线程安全的单例类
* 线程安全:
* 你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。
* 如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的。
* 就是线程安全的
* 饿汉单例是天生的线程安全
*/
private static final account ac = new account();
public static account getAccount(){
return ac;
}
public void getName(String name){
System.out.println("hello "+name);
}
}
测试类:
public class demo {
public static void main(String[] args) {
account ac1 = account.getAccount();
ac1.getName("李华");
account ac2 = account.getAccount();
ac2.getName("王华");
if(ac1 == ac2){
System.out.println("创建的是同一个类哦");
}else{
System.out.println("创建的不是同一个类哦");
}
}
}
这里我们最后打印出的结果是“创建的是同一个类哦”
下面说说懒汉式。懒汉式,他是在get方法里面实例化了当前对象
//懒汉式,顾名思义,它比较懒,最后在方法里面创建
private static account ac = null;
public static account getAccount(){
if(ac == null){
ac = new account();
}
return ac;
}
在多线程里,为了线程安全我们必须用synchronized关键字锁定
如:synchronized关键字 public static synchronized account getAccount()
只要符合线程安全都可以。
爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情