请问在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问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
单例模式中成员变量为什么一定要是私有的private
package danLi; public class AA { public static AA aa = new AA(); private AA() {} } //------------------------------------------ package danLi; public class Main { public static void main(String[...
单例模式的构造方法为什么私有 引用为什么设置为pravite static 属性为什么都要private
第一个问题: 类中的属性为什么设置为private的:主要是第二点吧 如果我getXXX里面对属性直接进行了操作或者加密,其他类调用的时候是看不懂的。起到一个封装的作用。(1)由于很多框架都是调用这两个方法来实现沟通,这是一种习惯了。(2)get/set方法也不一定只是简单的作一个赋值,或一个返回值吧,在这里可以作一些权限的控制,比如不是每个角色都可以赋值的。再比如返回的值不一定是值本身,可以是经...
为什么单例模式中要使用静态变量
可以从两方面理解: 首先,类的静态成员变量就是指的类共享的对象,而单例模式的对象设成静态就是为了让该类所有成员共享同一个对象,所以从语义上是合适的; 其次,从语法考虑,常见的单例模式都是通过一个静态方法(如getInstance)返回其单例,因为静态方法的内部不能直接使用非静态变量,所以返回的这个实例就是静态的
直接new 对象 Spring 不会注入的解决方法
1.建一个类实现ApplicationContextAware接口,有一个引用ApplicationContext的静态成员,然后,遗留系统需要引用spring管理的bean的地方,使用这个类。package com.eliteams.quick4j.web.utils;import com.eliteams.quick4j.web.listenner.ListennerTask; import o
单例模式singleton为什么要加volatile
或者许多的朋友在使用单例模式中会学到双重检查加锁(double-checked locking)的应用。public class Singleton { private volatile static Singleton uniqueInstance; private Singleton(){} public static Singleton getInstance(){
【小细节】单例模式与final关键字
在回顾单例模式的基本写法的时候,发现。 懒汉饿汉静态内部类。。就不说了 当我们写饿汉的时候代码如下 public class SingletonDemo { private static final SingletonDemo instance = new SingletonDemo(); private SingletonDemo(){} public s...
构造函数被私有化就没办法直接new一个对象
个人理解:把构造函数私有化(private),构造函数就不能通过外部访问,构造函数不能访问,自然就不能通过new创建一个新对象。(new对象时,一定会初始化,即调用构造函数) 作用:在单例设计中,Singleton类在定义的时候将构造方法私有化,而在内部仅仅new出一个对象,是为了禁止别的类在外面直接new Singleton()出来,这样你只要在Singleton类中new一个对象,就能确保无
java中new和反射的区别
java中new和反射的区别
Logger为什么用static final修饰
springboot中logger采用static final进行修饰: @Controller public class JspController { private static final Logger logger = LoggerFactory.getLogger(JspController.class); @RequestMapping("/jspIndex") ...
关键字static与单例模式的一点理解
static是java语言中的一个关键字,表示一个静态修饰符,修饰符比较容易理解,静态修饰符又有什么特点呢,首先程序中的任何变量或者代码都是在编译时,由系统自动分配内存来存储的,而静态的特点就是指,在编译后所分配的内存会一直存在,直到程序退出是才会释放这个空间。计算机语言是这样描述的,那程序语言又应该怎样去解释这个东西呢,以java语言为例:java语言中所有的东西都可以理解为对象(java是一门面
Java不能使用New去创建对象的情况
本人在学习单例模式的时候看到了这样的单例模式的创建方法: public class SimpleSingleton { private static SimpleSingleton singleInstance = new SimpleSingleton(); private SimpleSingleton(){ } public static SimpleSin
为什么使用工厂模式而不用new来创建对象
问:为什么感觉工厂模式没什么优势呢?比如我想用三种工厂模式中的工厂方法模式,但是它用子工厂返回对象和new对象一样吧,我觉得还没有new简单。    答:new你妹,需求的变更贯穿于每一个软件项目。设计模式精髓就在于应对“未来的变化”。当然这种变化主要是扩展性。   这是我目前看到的最能解决初学者困惑的回答! ...
c++单例模式为什么不在析构函数中释放静态的单例对象
需要清楚一下几点: 1、单例中的 new 的对象需要delete释放。 2、delete释放对象的时候才会调用对象的析构函数。 3、如果在析构函数里调用delete,那么程序结束时,根本进不去析构函数,怎么会delete。 4、如果程序结束能自动析构,那么就会造成一个析构的循坏,所以new对应于delete。
静态方法中使用内部类不能通过new
首先来看一下错误代码,public class TraditionalThreadSynchronized { public static void main(String[] args) { Outputer outputer = new Outputer(); new Thread(new Runnable() { @Override
静态方法中不能new内部类的实例对象
  因为内部类有一个重要特性,就是可以访问外部类的成员变量,既然是这样,那外部类就必须实例化。   但是在静态方法中,是可以不用new外部类的实例对象就可以运行。   所以这就造成了矛盾。   所以在静态方法中不能直接new内部类的实例对象,必须先实例化外部类的实例对象。   要想解决这个问题:   可以在外部类里面新建一个init方法,把new内部类的逻辑移植到init里...
什么是SpringIOC?为什么要用IOC而不是New来创建实例
什么是SpringIOC?为什么要用IOC而不是New来创建实例? 1.背景介绍 什么是spring: 2002年,Rod Johnson在《Expert One-on-One J2EE Design and Development》书中首次推出了Spring框架雏形interface21框架。到现在将近20年了。最早Spring是为了解决企业级应用开发的复杂性而创建的。但是归根究底它...
Object的锁使用
上一篇中用Condition实现了生产者和消费者,其中用到了Condition的await和singal,这个实现和Object的锁特别像,如果用Object的锁机制实现生产者和消费者,如下: import java.util.Date; import java.util.concurrent.ExecutorService; import java.util.concurrent.Exec
静态方法中new对象
package test;public class TestStatic {    private static TestStatic ts=new TestStatic();    private TestStatic(){}        public static TestStatic getIns(){        return ts;    }    public void getTe...
《Thinking in Java》——构造器是private时如何创建对象?
构造器是private时如何创建对象?可以通过static成员进行创建,如:class A { private A(){} //构造器是private修饰,不能在本类外通过new A();创建对象 public static A construct() { return new A(); //在public static修饰的方法中通过new A()创建对象,
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....
java通过new的方式调用static方法
最近重构项目时发现以前代码中,竟然有人用new对象的方式来调用类的静态方法,不都是通过类名.方法名直接调用嘛?这使我对自己认知产生了怀疑,于是查了查,总结一下就是,静态方法没必要通过new对象方式调用,new了占内存会多! new的时候会先把类中static修饰的方法加载到代码区,然后在开辟内存。 ...
java中对象变量及new对像赋值的1个语法现像
corejava中程序清单7-6,显示和复制图像。在ImageComponen和类中以下语句可以编译通过。 private Image image;    public ImageComponent()  {    image=new ImageIcon("blue-ball.gif").getImage();  } 但是如果改写成以下,则在编译过程中“=”处会提示错误:需要标识符
构造代码块,静态代码块,局部代码块与new对象时,执行的次序
一. 代码块概念: 使用{} 括起来的代码,称为代码块分类: 根据它位置和声明的不同,我们可以将代码块分为局部代码块,构造代码块,静态代码块,同步代码块(多线程涉及)a. 局部代码块限定了变量的生命周期,变量在局部代码块中定义的,那么出来局部代码块之后,就访问不到了。在局部代码块中定义的变量, 在出了代码块之后,内存就会释放掉。作用: 主要就是节约内存.局部代码块中定义的变量,虽然说作用域是
关于java的ArraryList中赋值——不是复制,需要new新的对象,才能加入
最近使用ArraryList 出现了明明存放了值,但是却没有内容的问题,其实后来发现我的代码用错了,或者说对于ArratyList的理解出错了,下面是我出错的代码 注意:这是其中一部分代码,mDataList是ArraryList类的一个对象, 其中元素是Article。 public void LoadData(){ Article article=new Article();
对象序列化的细节,Static属性不参与对象的序列化
定义一个学生信息类    身高tall为静态属性输出为99   static属性定义在类文件中之后,在其他类中调用该属性,并更改了tall的值,只是更改了内存中tall的值,类文件中定义的tall并没有受到影响,在调用时,先把类文件加载到内存中 ,修改得只是内存中tall的值,类文件定义的信息没有发生改变。当重新创建一个类去调用tall时 这时把类文件重新加载到内存中, 输出的还是类文件中的值。所...
Spring 注解 new创建对象后失效
遇到这么一个情况,想写一个Util工具类用于记录操作日志,在无法使用static关键字情况下,使用new来创建对象,随后运行一直报异常, java.lang.NullPointerException at net.wrtrd.adsystem.sql.dao.impl.LogMapperImpl.insertLog(LogMapperImpl.java:16) at net.wrtrd.ad
Java在new一个线程时使用的变量一定要用final修饰吗
这个是生命周期问题,举例说明: public static void main(String args[]){ final MyQueue mq = new MyQueue(5); Thread t1 = new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(100)...
Java设计模式之Singleton——四种不同的单例模式(Singleton)
单例模式(Singleton) 模式名称 单例模式(Singleton [ˈsɪŋgltən]) 问题 如果要保证系统里最多只能存在一个实例时,我们就需要单例模式。例如缓存池、数据库连接池等。 解决方案 实例一:最简单的单例模式 public class Singleton{ private static Singleton instanc...
static静态方法可以被继承吗?Student a= new Student(); new一个对象的过程发生了什么?
static静态变量被各个对象共享,有默认值,被静态修饰的东西先于对象存在。static修饰的变量和方法都在静态方法区,在加载class文件的时候就加载了,而继承发生在堆中,static修饰的变量和方法与对象无关,所以调用的时候不需要通过对象去调用,直接通过类名.方法()或类名.变量去调用,所以只能说static方法是被引用,而不是继承。一个对象的初始化过程:     Student a= new...
java创建对象时,new 出一个对象 和 = null的区别?
https://www.zhihu.com/question/21468505
Java:单例模式single
代码: class   Single{ private static Single INSTANCE=new Single(); private Single (){ } public static Single getInstance(){ return INSTANCE; } } class Example{ public static void main(String a...
java String中new和直接赋值的区别
在此之前,我们要知道的是,String是不可变对象,只要创建就不能修改,所有的修改操作实际上都是新建的String对象. 1.直接赋值 String myString = "hello world"; 原理是:现在java的常量池中寻找hello world对象,如果没有,在堆内存中new一个值为”hello world” 的对象,放到常量池中. 之后再用直接赋值的方法时,如果值相同,就直接...
为什么在子线程中直接new Handler会报错?
为什么在子线程中直接new Handler会报错:我们从报错开始追踪:“Can’t create handler inside thread that has not called Looper.prepare()” —-》 错误日志就来自Handler的默认构造方法,源码如下:/** * Default constructor associates this handler with
工厂模式解决如何不通过new来创建实例对象的方法
// 工厂模式解决如何不通过new来创建实例对象的方法 class mysql{ public function __construct(){echo "mysql";} } class oracle{ public function __construct(){echo "oracle";} } class Factory{ public static funct
static、final的个人详解
1.static方法就是没有this的方法,在static方法内部不可以调用非static的方法,反过来是可以的。而且可以在没有任何对象创建的情况下,通过类名调用,这正是static的主要用途。一句话概括就是:方便在没有对象的情况下调用。 2.static可以用来修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能。 3.为什么static方法中不能调用非static的
Java中new出来的算是对象吗?
    如题,一直有个问题困惑着我,基本类型中我们可以这样定义对象(以int为例): int a;     而引用类型却是只能new出来的,比如这样的: Human xiaoming=new Human();     问题来了,这里的xiaoming算是对象吗?如果说不是,那不是说好的万物皆对象该怎么解释,它不是Human类的一个实例吗?若是对象,为何跟基本类型定义的对象有很大的区别?...
静态方法不能new内部类实例对象
在学习多线程时,遇到了静态方法中不能new内部类实例对象的情况: public class TraditionalThreadSynchronized { public static void main(String[] args) { //错误。静态方法中不能new内部类的实例对象 内部类能访问外部类实例对象的成员变量 Outputer outputer = new Ou
static实现单例的隐患
1. 前言Java的单例有多种实现方式:单线程下的简单版本、无法在指令重排序下正常工作的Double-Check、static、内部类+static、枚举……。这篇文章要讨论的,是在使用static实现饿汉模式的单例时,会有隐患存在。2. Static单例的隐患2.1 传统写法static实现单例的代码如下:public class Singleton { private static Si
java类 跳过private限制,访问对象的成员属性、成员方法
实体类:public class Person { private String name = "aaa"; private String sex = "bbb"; private void doSomethingPrivate() { System.out.println("啪啪啪"); } @Override public String toString() { r...
scala不使用new关键字创建对象实例
在scala中,scala不使用new关键字创建对象实例,一般有2中方法: 1. 为类创建伴生对象,并在伴生对象内按照所需的构造函数签名定义一个apply方法; 2.将类定义为case类。 1)用apply方法创建一个伴生对象: class ApplyOperation { } class ApplyTest{ def apply() = println("I am i