请问在java单例设计模式中,为什么要private static对象的时候不直接new出来?

请问单例设计模式为什么采用第一种方法,不采用第二种方法?谢谢!

第一种,一般采用的方法
public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance(){
if (instance ==null){
synchronized (Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}

第二种,我自己的方法
public class Singleton {
private static Singleton instance = new Singleton();

private Singleton() {
}
public static Singleton getInstance(){
    return instance;
}

}

0

2个回答

第一种方法是懒惰加载,节约了一点点内存和运算时间(取决于构造函数做了什么),然而在早期,jvm的设计有bug,在多cpu上,两次instance ==null,或者叫做double check lock(dcl)的办法,不能保证多线程的安全性,甚至造成死锁。所以那时候会推荐在并发环境下,用后面的写法。

现在的jvm没有那个问题,cpu和内存也不再那么值钱,所以现在很少有人纠结了,两个办法都可以。

延伸阅读:https://www.javaworld.com/article/2074979/java-concurrency/double-checked-locking--clever--but-broken.html (可能需要科学上网)
https://blog.csdn.net/chenchaofuck1/article/details/51702129

1

都可以啊 只是你的方法会在类加载的时候就创建对象 这样就会比较浪费空间
第一种是懒加载 当需要的时候再去创建 这样会更好

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
单例模式的构造方法为什么私有 引用为什么设置为pravite static 属性为什么都要private
第一个问题: 类中的属性为什么设置为private的:主要是第二点吧 如果我getXXX里面对属性直接进行了操作或者加密,其他类调用的时候是看不懂的。起到一个封装的作用。(1)由于很多框架都是调用这两个方法来实现沟通,这是一种习惯了。(2)get/set方法也不一定只是简单的作一个赋值,或一个返回值吧,在这里可以作一些权限的控制,比如不是每个角色都可以赋值的。再比如返回的值不一定是值本身,可以是经...
关键字static与单例模式的一点理解
static是java语言中的一个关键字,表示一个静态修饰符,修饰符比较容易理解,静态修饰符又有什么特点呢,首先程序中的任何变量或者代码都是在编译时,由系统自动分配内存来存储的,而静态的特点就是指,在编译后所分配的内存会一直存在,直到程序退出是才会释放这个空间。计算机语言是这样描述的,那程序语言又应该怎样去解释这个东西呢,以java语言为例:java语言中所有的东西都可以理解为对象(java是一门面
单例模式中成员变量为什么一定要是私有的private
package danLi; public class AA { public static AA aa = new AA(); private AA() {} } //------------------------------------------ package danLi; public class Main { public static void main(String[...
静态方法中new对象
package test;public class TestStatic {    private static TestStatic ts=new TestStatic();    private TestStatic(){}        public static TestStatic getIns(){        return ts;    }    public void getTe...
java中的常量,是不是必须定义为static final的呢
<br />今天看代码的时候,关于常量的引用,脑子中突然闪现出一个概念。java中的常量,是不是必须定义为static final的呢?final定义的字段,已经是不可改变的了,为什么还必须要加上一个static呢?<br /> <br />比如<br />private static final int one = 1;<br />如果定义为<br />private final int one = 1;<br />两者有不什么不同吗?答案是肯定的,他们都是一样的。那为什么还要加上一个static呢?<b
为什么单例模式中要使用静态变量
可以从两方面理解: 首先,类的静态成员变量就是指的类共享的对象,而单例模式的对象设成静态就是为了让该类所有成员共享同一个对象,所以从语义上是合适的; 其次,从语法考虑,常见的单例模式都是通过一个静态方法(如getInstance)返回其单例,因为静态方法的内部不能直接使用非静态变量,所以返回的这个实例就是静态的
java创建对象时,new 出一个对象 和 = null的区别?
https://www.zhihu.com/question/21468505
构造函数被私有化就没办法直接new一个对象
个人理解:把构造函数私有化(private),构造函数就不能通过外部访问,构造函数不能访问,自然就不能通过new创建一个新对象。(new对象时,一定会初始化,即调用构造函数) 作用:在单例设计中,Singleton类在定义的时候将构造方法私有化,而在内部仅仅new出一个对象,是为了禁止别的类在外面直接new Singleton()出来,这样你只要在Singleton类中new一个对象,就能确保无
java同步机制对象锁使用方式比较
class Sync { private byte[] lock = new byte[0]; public void sync() throws InterruptedException { synchronized (lock) { runThread(); } } public void thi
单例模式singleton为什么要加volatile
或者许多的朋友在使用单例模式中会学到双重检查加锁(double-checked locking)的应用。public class Singleton { private volatile static Singleton uniqueInstance; private Singleton(){} public static Singleton getInstance(){
java单例设计模式中你可能不知道的秘密
有简单又高效的方法可以实现单例模式,但没有一种方式能在任何情况下都确保单例的完整性。 单例模式是指某个类只被实例化一次,用来表示全局或系统范围的组件。单例模式常用于日志记录、工厂、窗口管理器和平台组件管理等。我认为要尽量避免使用单例模式,因为一旦实现就很难改变或重载,而且会造成编写测试用例困难、代码结构糟糕等问题。另外,下面文章中的单例模式是不安全的。 人们花大量的精力研究怎样更好地实
一个含static字段的类的对象没有被引用是否会被GC回收?
[size=large]看到项目中有这里的代码,大家看下,一个类里面有一个static字段的变量,当new一个对象后,没有被引用,是否会被垃圾回收器回收? 比如,代码如下:[/size] [code=&quot;java&quot;]public class Sta { private static int s = 0; public Sta(int i) { ...
单例饿汉模式中final关键字的作用
多线程的final详解
c++单例模式为什么不在析构函数中释放静态的单例对象
需要清楚一下几点: 1、单例中的 new 的对象需要delete释放。 2、delete释放对象的时候才会调用对象的析构函数。 3、如果在析构函数里调用delete,那么程序结束时,根本进不去析构函数,怎么会delete。 4、如果程序结束能自动析构,那么就会造成一个析构的循坏,所以new对应于delete。
直接new 对象 Spring 不会注入的解决方法
1.建一个类实现ApplicationContextAware接口,有一个引用ApplicationContext的静态成员,然后,遗留系统需要引用spring管理的bean的地方,使用这个类。package com.eliteams.quick4j.web.utils;import com.eliteams.quick4j.web.listenner.ListennerTask; import o
java中new和反射的区别
java中new和反射的区别
对象的引用调用private类型函数的问题
public class Test1{  private void f(){   System.out.println ("private f()");  }  public static void main (String[] args) {   Test1 po=new Test1();   po.f();  } } 疑问:为何在类Test1中,创建他本身的对象的时候,其对象
构造代码块,静态代码块,局部代码块与new对象时,执行的次序
一. 代码块概念: 使用{} 括起来的代码,称为代码块分类: 根据它位置和声明的不同,我们可以将代码块分为局部代码块,构造代码块,静态代码块,同步代码块(多线程涉及)a. 局部代码块限定了变量的生命周期,变量在局部代码块中定义的,那么出来局部代码块之后,就访问不到了。在局部代码块中定义的变量, 在出了代码块之后,内存就会释放掉。作用: 主要就是节约内存.局部代码块中定义的变量,虽然说作用域是
为什么使用spring框架中的IOC来创建对象?它和使用new关键字来创建对象的区别是什么?
首先,java是一门灵活的语言,到达同一个目的,可以有无数种方法,这个和解答数学题有点类似。 第二,使用new关键字创建的对象属于强引用对象,所谓强引用,就是jvm垃圾回收机制永远不会回收这类对象,这时候需要程序员去手动去在应该移除引用的时候去将它移除。如果没有移除,这个对象将一直存在,久而久之,会引起内存泄露问题。 第三,使用spring中的IOC就能很好的解决上述问题,使用IOC创建对象的...
java中的private static变量的小心得
package zz; public class zz { private static String z="12321"; public void set(String zz) {    z=zz;//static修饰的变量不能用this.z=zz;因为它是类变量。不用static修饰的变量可以this,XX=xx; } public void get() { Syst
静态方法中不可直接new内部类实例对象问题
结论:静态方法中,是不可以直接new内部类实例对象和引用外部类的成员变量的。原因:1、外部类中的成员变量、方法以及内部类其实三者都在同一个级别上,三者都必须由外部类的实例对象才能调用(举例:当一个方法被调用时,此时肯定已经有了外部类的实例对象。),故而他们三者可以互相引用。2、而静态main方法因为其方法为静态,在类编译时,便生成了该静态方法,故而其运行不依赖于外部类的实例对象,因为内部类要依赖于...
java为什么定义javaBean的时候设置为private然后去get和set,而不是直接使用public?
java为什么定义javaBean的时候设置为private然后去get和set,而不是直接使用public? 原因如下: 1.统一出入口。这样我只需要规定哪些属性你可以操作(get或者set,而且是可选的,有些属性只能set,有些只能get),有些属性不开放,set和get都不给你用,也就是属性不对外开放。 2.外部类对该类的属性调用有比较好的适应性,保证代码有比较好的完整性。举个简单的例子,我...
Object的锁使用
上一篇中用Condition实现了生产者和消费者,其中用到了Condition的await和singal,这个实现和Object的锁特别像,如果用Object的锁机制实现生产者和消费者,如下: import java.util.Date; import java.util.concurrent.ExecutorService; import java.util.concurrent.Exec
Logger为什么用static final修饰
springboot中logger采用static final进行修饰: @Controller public class JspController { private static final Logger logger = LoggerFactory.getLogger(JspController.class); @RequestMapping(&quot;/jspIndex&quot;) ...
static 和new对象方法的区别
学完static以后,同学们都觉得用static修饰的成员特别方便,不用创建对象就可以使用,而不用static修饰的成员倒显得麻烦了,非得创建对象才能使用,但我们平时定义方法时又很少使用static。为什么呢,那什么时候用static,又什么时候不用static呢?我们抛开static成员使用的特点,理解一下static修饰成员的意义。类的一个成员被static修饰后,该成员就属于类的成员了,被所
new出来的对象无法调用@Autowired注入的Spring Bean
@Autowired注入Spring Bean,则当前类必须也是Spring Bean才能调用它,不能用new xxx()来获得对象,这种方式获得的对象无法调用@Autowired注入的Bean。 1、类1,加入Spring Pool public class PersonServiceImpl implements PersonService{ public void save(){
为什么static修饰SimpleDateFormat会有问题
原文地址:http://www.cnblogs.com/zemliu/archive/2013/08/29/3290585.html 1. 原因 SimpleDateFormat(下面简称sdf)类内部有一个Calendar对象引用,它用来储存和这个sdf相关的日期信息,例如sdf.parse(dateStr), sdf.format(date) 诸如此类的方法参数传入的日期相关Str
Spring 注解 new创建对象后失效
遇到这么一个情况,想写一个Util工具类用于记录操作日志,在无法使用static关键字情况下,使用new来创建对象,随后运行一直报异常, java.lang.NullPointerException at net.wrtrd.adsystem.sql.dao.impl.LogMapperImpl.insertLog(LogMapperImpl.java:16) at net.wrtrd.ad
ThreadLocal类为什么要加上static修饰
问题的来源是:    在我写一个OpenSessionFilterInView的时候(当然Spring已经有了这个功能),需要在view中这里也就是在Filter中从spring工厂的hibernate sessionFactory中获取一个session,并且需要把session传到DAO当中,那么问题来了,如果ThreadLocal是静态的,那么多线程并发的时候 主存中只有一个ThreadL
new一个类对象和使用类名创建一个对象有什么区别?该怎么解决
举个简单的例子:  class Domo {  private: int x; int y;  public: void Set(int a,int b):x(a),y(b){} void Print() { cout };   void main()  {  Demo p;  Demo *q=new Point(); p.Set
JAVA 复制对象时为什么要用克隆clone()而不用“=”的原因
今天一直很纠结为什么java里面有个clone()方法,复制对象时直接“=”不就行了,为什么还要在每个类里面重写clone方法。     Google了下,发现这个是典型的先学C/C++后再学JAVA遇到的问题,原来在JAVA中默认的“=”赋值操作,其实是将一个引用复制过去了,二
静态方法中使用内部类不能通过new
首先来看一下错误代码,public class TraditionalThreadSynchronized { public static void main(String[] args) { Outputer outputer = new Outputer(); new Thread(new Runnable() { @Override
java NEW一个对象之后加入大括号
有两种情况:   1.初始化对象(匿名类): Class1 model = new Class1(){            { //new 对象后的大括号内可以对公开的成员变量,以及属性赋值.                Id=id,                Title=name,                Content=content,            }}; 举例...
String 直接赋值和new 对象
用一个简单的例子表述Stirng直接赋值和new对象的区别 String a = new String(“a”); String b = new String(“a”); //此处是比较的是对象引用的地址 System.out.println(“比较内存地址是否相等”); System.out.println(a==b);(此处结果为false) //此处比较的是字符串的值 System.out....
为什么不能通过new List()方式创建对象
在java.util里面List是一个接口,所以不能直接初始化,所以会编译错误 你可以List l =new ArrayList();这样是可以的,因为 ArrayList是实现List接口的 或者List l = new LinkedList(); LinkedList同样实现了List接口 我们一般使用List都是new ArrayList();
采用static Map、ConcurrentHashMap实现数据缓存
考虑到在使用HashMap在并发时会出现不正确行为,自己编写了采用static ConcurrentHashMap来完成静态缓存的处理,目的是为了能够用来处理高并发的线程安全类,如有问题请各指教。
spring的注入和直接new一个对象有什么不同?
spring实现了对象池,一些对象创建和使用完毕之后不会被销毁,放进对象池(某种集合)以备下次使用,下次再需要这个对象,不new,直接从池里出去来用。节省时间,节省cpu.   转自度娘...
static静态方法可以被继承吗?Student a= new Student(); new一个对象的过程发生了什么?
static静态变量被各个对象共享,有默认值,被静态修饰的东西先于对象存在。static修饰的变量和方法都在静态方法区,在加载class文件的时候就加载了,而继承发生在堆中,static修饰的变量和方法与对象无关,所以调用的时候不需要通过对象去调用,直接通过类名.方法()或类名.变量去调用,所以只能说static方法是被引用,而不是继承。一个对象的初始化过程:     Student a= new...
【小细节】单例模式与final关键字
在回顾单例模式的基本写法的时候,发现。 懒汉饿汉静态内部类。。就不说了 当我们写饿汉的时候代码如下 public class SingletonDemo { private static final SingletonDemo instance = new SingletonDemo(); private SingletonDemo(){} public s...
Java设计模式之Singleton——四种不同的单例模式(Singleton)
单例模式(Singleton) 模式名称 单例模式(Singleton [ˈsɪŋgltən]) 问题 如果要保证系统里最多只能存在一个实例时,我们就需要单例模式。例如缓存池、数据库连接池等。 解决方案 实例一:最简单的单例模式 public class Singleton{ private static Singleton instanc...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 为什么要学习java java为什么要学习js

相似问题

2
请问在java单例设计模式中,为什么要private static对象的时候不直接new出来?
2
java怎么判断python脚本命令是否符合语法规则?
1
java怎么判断shell命令是否符合语法规则?
2
idea运行的时候报错 error:java:无效的标记: D:\xxx\lib, 但是这个路径没有lib文件夹
6
网站运行一段时间后就出问题,日志显示是空指针错误,为什么?请教!
2
java8 stream源码中stream.collect(Collectors.toList()) 传参没有理解
1
如何实现在客户端或浏览器页面中集成一个类似plsqldeveloper一样的查询功能?
2
如图,请问是什么原因?
4
怎样用Java描述数据库中出现的:当出现某种情况的时候就把这一条没用的数据删掉
1
java运行jar包, 两种方式项目都可以运行成功,但是访问项目时,java -jar 会报异常
1
Java微信公众号开发,菜单跳转问题
7
java中实现发送邮件 session.getTransport() 为什么是null?
1
Java程序运行时,类和实例在内存中的状态是怎么样的?类和实例在内存中都可能出现几个副本吗?
3
为什么没有报错,但一点编译就会出现之前上一个代码的运行结果,求各位大神指点?
4
java中实现发送邮件 session.getTransport() 为什么是null?
1
JAVA JTable 自定义CellEditor中定义了键盘事件,输入时确不响应键盘事件?
1
急求一个java能够实现杨辉三角的代码,萌新求大佬帮助。
1
为什么我这个jsp无法接受服务器传的数据,而且就算服务器的list是空的jsp表格里也会有一行,哪里错了?
5
我用ssm写的项目,在A方法中获取了一个list数组怎么直接在b方法中使用
1
怎么用java的ftp来获取某个文件夹下的部分文件?