单例模式(Singleton)的同步锁synchronized
  PKZiXow9dOUY 2023年12月07日 27 0

当两个人同时操作一条数据时会引起并发,这时候可以用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;
    }
}







【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月07日 0

暂无评论

推荐阅读
  H5mLmDf4pUDu   2023年11月02日   24   0   0 Java线程同步
PKZiXow9dOUY