单例模式的一般例子:
public class Singleton{
private static Singleton instance = null;
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instace;
}
}假设这样一个场景,有两个线程调用Singleton.instance(),首先线程一判断instance是否等于null,判断完后一瞬间虚拟机把线程二调度为运行线程,线程二再次判断instance是否为null,然后创建一个Singleton实例,线程二的时间片用完后,线程一被唤醒,接下来它执行的代码依然是instance = new Singleton();
两次调用返回了不同的对象,出现问题了。
解决方案:(1)类被载入时就初始化这个对象:private static Singleton instance = new Singleton();
JLS(Java Language Specification)中规定了一个类只会被初始化一次,所以这样做肯定是没问题的。
但是如果要实现延迟初始化(Lazy initialization),比如这个实例初始化时的参数要在运行期才能确定
(2)使用synchronized关键字修饰初始化方法:
public synchronized static Singleton getInstace() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
分享到:
相关推荐
singleton是最常见的设计模式,但是要设计好却是不容易,尤其是多线程的时候,需要考虑线程安全的问题.
单例模式 Singleton 单例模式线程安全问题和拓展
singleton是最常见的设计模式,但是要设计好却是不容易,尤其是多线程的时候,需要考虑线程安全的问题.
1.寂寞的Singleton 2. 当Singleton遇见多线程 4.安全发布 6. 讨论的延续 1. JavaWorld章:Double-checked l
在编译器未优化的情况下顺序如下:1.new operator分配适当的内存;2.在分配的内存上构造Singleton对象;3.内存地址赋值给_instance
:backhand_index_pointing_right: 实现安全的Objective C Singleton。 :beer_mug: 关于安全 “安全”是指: 多线程安全 使用安全,即通过new类方法、init方法仍然返回的是同一个单例对象。new/init方法不做处理用户...
前段时间在网上看到了个的面试题,大概意思是如何在不使用锁和C++11的情况下,用C++实现线程安全的Singleton。 看到这个题目后,第一个想法是用Scott Meyer在《Effective C++》中提到的,在static成员函数中...
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。 整理了六种单例模式的实现方式以及它们之间的区别,包括是否线程安全,是否懒加载,是否反射安全,是否序列号安全
单例模式的四种示例 静态常量 线程安全,同步方法 双重检查 静态内部类
* 静态内部类,使用枚举方式,线程安全(推荐)public enum Singleton6 {* 静态内部类,使用双重校验锁,线程安全(推荐)public st
springmvc的controller是singleton的(非线程安全的),这也许就是他和struts2的区别吧和Struts一样,Spring的Controller默认是Singleton的,这意味着每个request过来,系统都会用原有的instance去处理,这样导致了...
C++11实现线程安全的单例代码和测试代码,包含singleton.h,main.cpp,希望帮助到大家。
基于QT的单例设计模式开发和测试,包括:线程安全的单例生成、静态结构体数组使用和结构体指针new生成。
首先是线程安全的单例,其次不是。 测试的输出是: synchronizedTest Started... Thread 2 instance is : com.caslaner.designpatterns.singleton.service.CacheSynchronized@53a816e5 Thread 1 instance is : ...
从上篇内容不如题的文章《.net core 并发下的线程安全问题》扩展认识.net core注入中的三种模式:Singleton、Scoped 和 Transient 我们都知道在 Startup 的ConfigureServices 可以注入我们想要的服务,那么在注入的...
Flutter移动应用程序可通过Routes,Singleton模式,Bloc模式,推送通知(Firebase),共享首选项,SQLite关系数据库,ChangeNotifier来模拟iOS转换器,并通过GitHub Actions管理状态,地图,安全性和CI / CD。...
一个java线程安全的单例模式:饥饿模式和延迟加载
一、我们说正方形是矩形,但如果把这种关系直接映射为面向对象中的类继承关系如: classRectangle{ /*...*/}; classSquare:publicRectangle {/*...*/};... 线程安全; 3. Singleton 实例中的资源能在恰当的时机释放。