❶ java单例模式饿汉式会有线程安全问题吗
1、答案:不会有线程安全问题。
2、首先,一个类可以被使用必须经过 加载、连接和初始化
3、饿汉模式的对象创建是在初始化的时候创建的,初始化操作是jvm执行的(会给类变量赋初始值,执行静态代码块等,类变量是用static修饰的变量),并且在我们看来一个类的初始化只会执行一次(jvm会控制),是不会有线程安全问题出现的
3、纠错:不是“类一加载就实例化”,而是类先加载、连接(此步骤执行时间不固定,但是在初始化执行前必须执行结束)。初始化执行的时机是你new了一个对象,或者使用了反射机制,或者调用类的静态变量和方法或者启动有main方法的类
❷ JAVA 懒汉式 饿汉式 区别
这个是在单例设计模式中提及的,就是一个类希望不让它不停的实例化对象,只能有一个对象
饿汉式(还没使用到这个对象时就已经实例化了)
public class Text{
private Text(){}//将构造函数私有化
private static Text t=new Text();//私有的Text型变量
public static Text getText(){
return t;
}
}
懒汉式(使用到的时候才实例化)
public class Text{
private Text(){}//将构造函数私有化
private static Text t;//私有的Text型变量(未实例化)
public static Text getText(){
if(t==null){
t=new Text();
}
return t;
}
}
懒汉式性能上应该是比饿汉式好,但是要考虑的东西多一点,还需要考虑线程同步的时候可能带来的隐患(此处没写)
❸ Java饿汉式多大机率出现多个对象
publicclassMyFactory{
//这里的volitale不可或缺
=null;
privateMyFactory(){
}
(){
if(factory==null){
synchronized(MyFactory.class){
if(factory==null){
factory=newMyFactory();
}
}
}
returnfactory;
}
}
如上上面的代码,如果你不加volitale关键字,那么由于可见性的原因,多线程并发情况下就可能new多个对象,至于概率多大,这个没有一个准确的值,要看你线程并发情况。
我的这篇文章对线程安全有详细的分析java线程安全
如果觉得我的回答对你有帮助,可以关注简书--早晚程序员或者微信公众号--早晚程序员
❹ java常用的几种单例模式(懒汉式,饿汉式
单件模式用途:
单件模式属于工厂模式的特例,只是它不需要输入参数并且始终返回同一对象的引用。
单件模式能够保证某一类型对象在系统中的唯一性,即某类在系统中只有一个实例。它的用途十分广泛,打个比方,我们开发了一个简单的留言板,用户的每一次留言都要将留言信息写入到数据库中,最直观的方法是没次写入都建立一个数据库的链接。这是个简单的方法,在不考虑并发的时候这也是个不错的选择。但实际上,一个网站是并发的,并且有可能是存在大量并发操作的。如果我们对每次写入都创建一个数据库连接,那么很容易的系统会出现瓶颈,系统的精力将会很多的放在维护链接上而非直接查询操作上。这显然是不可取的。
如果我们能够保证系统中自始至终只有唯一一个数据库连接对象,显然我们会节省很多内存开销和cpu利用率。这就是单件模式的用途。当然单件模式不仅仅只用于这样的情况。在《设计模式:可复用面向对象软件的基础》一书中对单件模式的适用性有如下描述:
1、当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
2、当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
下面对单件模式的懒汉式与饿汉式进行简单介绍:
1、饿汉式:在程序启动或单件模式类被加载的时候,单件模式实例就已经被创建。
2、懒汉式:当程序第一次访问单件模式实例时才进行创建。
如何选择:如果单件模式实例在系统中经常会被用到,饿汉式是一个不错的选择。