gpt4 book ai didi

java - 何时不使单例线程安全

转载 作者:行者123 更新时间:2023-12-04 04:49:13 24 4
gpt4 key购买 nike

我正在学习一些设计模式并发现了神奇的单例模式!

似乎有两种实现单例模式的主要方法 - 一种是线程安全的(使用 synchronized 关键字),另一种不是线程安全的。

我的问题是,什么时候希望让他们的单例线程安全?即使最初的程序设计没有实现线程,也不知道 future 的迭代是否会有这种需求。使单例线程安全时会有性能损失吗?或者我遗漏的其他一些原因对线程安全的单例不利?

示例线程安全单例:

/**
* Thread Safe Singleton Pattern
*
*/
public class Database {
private volatile static H2 uniqueInstance;

public static H2 getInstance() {
if (Database.uniqueInstance == null) {
synchronized (Database.class) {
if (Database.uniqueInstance == null) {

/**
* Instantiate First and Only instance of H2
*/
Database.uniqueInstance = new H2();
}
}
}
return Database.uniqueInstance;
}
private Database() {};
}

示例非线程安全单例:

/**
* Non Thread Safe Singleton Pattern
*
*/
public class Database {
private volatile static H2 uniqueInstance;

public static H2 getInstance() {
if (Database.uniqueInstance == null) {

/**
* Instantiate First and Only instance of H2
*/
Database.uniqueInstance = new H2();
}
}
return Database.uniqueInstance;
}
private Database() {};
}

最佳答案

如果您正在编写一个您知道只有您会使用并且不涉及线程的程序,那么您不需要同步

如果您使用的单例是不可变的或没有可变状态,那么您也不需要使用同步

所以基本上这取决于您的目的、可变状态(或缺少可变状态)以及您的单例的可能用途。

正如旁注:这是常识,它不仅适用于单例 模式,而且适用于许多情况。

关于java - 何时不使单例线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17688304/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com