首页 > 其他分享 >线程安全的单列模式(4种)

线程安全的单列模式(4种)

时间:2023-02-08 11:35:40浏览次数:37  
标签:Singleton 单列 private instance 线程 模式 new static public


1.不使用同步锁


public class Singleton {

private static Singleton s = new Singleton();//直接初始化一个实例对象

private Singleton() {///private类型的构造函数,保证其他类对象不能直接new一个该对象的实例
System.out.println("Singleton");
}

public static Singleton getSingle() {//该类唯一的一个public方法
return s;
}

}

上述代码中的一个缺点是该类加载的时候就会直接new 一个静态对象出来,当系统中这样的类较多时,会使得启动速度变慢 。现在流行的设计都是讲“延迟加载” ,我们可以在第一次使用的时候才初始化第一个该类对象。所以这种适合在小系统。



2.使用同步方法



public class Singleton {

private static Singleton instance;

private Singleton() {}

public static synchronized Singleton getIntance() {//对获取实例的方法进行同步
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}


上述代码中的一次锁住了一个方法, 这个粒度有点大 ,改进就是只锁住其中的new语句就OK。就是所谓的“双重锁”机制。



3.使用双重同步锁


public class Singleton {

private static Singleton instance;
private Singleton() {}

public static Singleton getInstance() {
if(instance == null) {
synchronized (Singleton.class) {
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}

}


4.使用内部类,既不用加锁,也能实现懒加载


public class Singleton4 {

private Singleton4() {
System.out.println("single");

}

private static class Inner {
private static Singleton4 s = new Singleton4();
}

public static Singleton4 getSingle() {
return Inner.s;//返回一个类的静态对象,只有调用这语句内部类才会初始化,所以能实现赖加载
}

}





标签:Singleton,单列,private,instance,线程,模式,new,static,public
From: https://blog.51cto.com/u_12182769/6043792

相关文章

  • ThreadLocal: 线程独享
    ThreadLocal线程局部变量ThreadLocal是使用空间换时间,synchronized是使用时间换空间比如在hibernate中session就存在与ThreadLocal中,避免synchronized的使用packagecom.mo;......
  • 线程问题<2>
    面试题:写一个固定容量同步容器,拥有put和get方法,以及getCount方法能够支持2个生产者线程以及10个消费者线程的阻塞调用1.使用wait和notify/notifyAll来实现publicclassTest......
  • 线程问题<1>
    实现一个容器,提供两个方法,add,size写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束1.第一种方法是......
  • java多线程编程核心技术(1丶2章)
    java多线程编程第一章:实现多线程编程主要有两种方式,一种是继承Thread类,另一种是实现Runnable接口。使用继承Thread类的方式创建新线程时,最大的......
  • 开源基于.Net Core 6.0 +DDD模式开发的通用权限系统
    项目简介这是一个基于.NetCore6.0+DDD模式开发的通用权限系统。前端借鉴了诺依的框架,框架选型都是使用了比较最新的技术、前后端分离。技术架构1、跨平台:这是基于.Ne......
  • 结合spring策略模式(不能直接抄,能懂的自然懂)
    publicclassController{finalList<Service>services;privatefinalMap<Enum,Service>enumMap=newEnumMap<>(TaxSiteEnum.class);@PostConst......
  • Hive 严格模式
    定义hive提供了一个严格模式,可以防止用户执行那些可能产生意想不到的不好的效果的查询。即某些查询在严格在严格模式下无法执行,通过设置hive.mapred.mode的值为strict,可以......
  • Intel CPU且操作系统是Windows 10 20H1或之后版本开启高性能模式
    (77封私信/78条消息)笔记本高性能模式怎么没了?-知乎(zhihu.com) cmd输入指令[powercfg-SETACTIVE 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c]......
  • java创建线程的方式有几种?
    java中创建线程的方式有多少种,这个问题也是众多纷纭,这个时候更应该参考官方文档(https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html)了,文档很明确地指出......
  • python 的多线程
    创建一个多线程fromthreadingimportThread,ThreadErrorimporttimedeftask_01():print("开始发送邮件")time.sleep(1)print("邮件发送成功")i......