首页 > 其他分享 >单例模式(Singleton)的同步锁synchronized

单例模式(Singleton)的同步锁synchronized

时间:2023-12-06 18:32:48浏览次数:30  
标签:Singleton synchronized private instance static 单例 public

当两个人同时操作一条数据时会引起并发,这时候可以用synchronized锁住代码块,进行相关处理。

注:JPAUtil根据ID查询不是实时数据,可能里面有缓存。后改成DBTool 原生查询sql,才查出实时数据。

DBTool tool = new DBTool();
Record[] r = tool.executeQuery("select state from tableName where uuid='" + uuid+ "'", null);

单例模式,有“懒汉式”和“饿汉式”两种。

1、懒汉式

单例类的实例在第一次被引用时候才被初始化。

public class Singleton {
    private static Singleton instance=null;

    private Singleton() {

    }

    public static Singleton getInstance(){
        if (instance == null) {
            instance = new Singleton();
        }

        return instance;
    }
}

2、饿汉式

单例类的实例在加载的时候就被初始化。

public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {

    }

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

在单线程中,上面两种形式基本可以满足要求了,但是在多线程环境下,单例类就有可能会失效,这个时候就要对其加锁了,来确保线程安全。

对线程加锁用的synchronized关键字,这个关键字的用法主要也分为两种:

一种是加在方法名之前,形如:public synchronized void methodeName(params){……};

二是声明同步块,形如:public void methodeName(params){synchronized(this){……}};

下面是对懒汉式单例类加上线程同步的实现:

public class Singleton {
    private static Singleton instance=null;

    private Singleton() {

    }

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

        return instance;
    }
}

这种方式效率比较低,性能不是太好,不过也可以用,因为是对整个方法加上了线程同步,其实只要在new的时候考虑线程同步就行了,这种方法不推荐使用。

同步代码块:

public class Singleton {
    private static Singleton instance;
    private final static Object syncLock = new Object();

    private Singleton() {

    }

    public static Singleton getInstance(){
        if (instance == null) {
            synchronized (syncLock) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }

        return instance;
    }
}

synchronized同步块括号中的锁定对象是采用的一个无关的Object类实例,而不是采用this,因为getInstance是一个静态方法,在它内部不能使用未静态的或者未实例的类对象,因此也可以用下面的方法来实现:

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;
    }
}







标签:Singleton,synchronized,private,instance,static,单例,public
From: https://blog.51cto.com/u_16326878/8708436

相关文章

  • 单例模式
    创建单例模式importthreadingimporttimeclassSingleton:instance=None#加锁是为了当多线程调用时,防止出现多线程执行太快都去新建了一个对象,这就违背了单例模式的意义lock=threading.RLock()def__init__(self,name):self.name=nam......
  • 深入理解和实现Qt中的单例模式
    在Qt框架中,单例模式的实现是一个常见的需求,它有多种实现方式,每种都有其特点。以下是对这些方法的探讨,包括宏定义方式、模板类方式,以及Qt的内置单例宏,并附有具体的使用示例。宏定义方式的单例模式宏定义方式是一种传统且直接的实现单例模式的方法,但它可能导致代码重复和类型安全......
  • ReenTrantLock可重入锁(和synchronized的区别)总结
    可重入性:从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大。两者都是同一个线程没进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。锁的实现:Synchronized是依赖于JVM实现的,而ReenTra......
  • Linux上使用CMake简单例子
    记录一下自己简单在linux-Ubuntu上用cmake的例子首先安装cmakesudoaptinstallcmake然后创建一个文件夹,里面放点例子代码main.cpp//main.cpp#include<iostream>#include"demo.h"usingnamespacestd;intmain(){Demod;d.show();return0;}demo.h//de......
  • 23种设计模式——单例模式
    今天来学习23种设计模式的第一种,单例模式,同时也是设计模式中最简单的模式之一。概念:所谓类的单例模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。特点:单例类只有一个实例对象;该单例对象必......
  • .net7(.net core) 依赖注入:从 AddSingleton 注册的类里面访问 AddScoped 的问题
    记录一下以免忘记。今天从NopCommerce开源项目里面把它的任务调度类拆出来到我的项目用的时候,发现报错,报错信息如下Someservicesarenotabletobeconstructed(Errorwhilevalidatingtheservicedescriptor'ServiceType:OUC.Services.ScheduleTasks.ITaskSchedulerLi......
  • 多开中多线程,每个线程使用一个单例
    defsingleton(cls):threadNames=[]#线程名称列表instances={}#实例字典defget_instance(threadName,*args,**kwargs):"""获取单例实例,通过线程名创建单例,保障每个线程里面的实例保持一致参数:-threadName:......
  • 实验7:单例模式
     本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解单例模式的动机,掌握该模式的结构;2、能够利用单列模式解决实际问题。 [实验任务一]:学号的单一仿照课堂的身份证的例子,实现每个同学仅有一个学号这一问题。实验要求:1. 画出对应的类图;2.提交源代码;3.注......
  • 设计模式之-单例模式
    1、是什么?单例模式是一种常用的软件设计模式,它在一个类中只允许创建一个对象实例,并且提供一个全局访问点来访问该实例。2、怎么玩?单例模式需要满足三个条件:单例类只能有一个实例;单例类必须自己创建自己的唯一实例;单例类必须给所有其他对象提供这一实例。(1)懒汉式packageco......
  • AddTransient、AddSingleton、AddScoped的区别
    权重:AddSingleton→AddTransient→AddScopedAddSingleton的生命周期:项目启动-项目关闭 相当于静态类 只会有一个 AddScoped的生命周期:请求开始-请求结束 在这次请求中获取的对象都是同一个 AddTransient的生命周期:请求获取-(GC回收-主动释放)每一次获取的对象都不......