使用单例设计模式时,其他方法是否需要使用synchronized关键字来确保线程安全?

问题描述 投票:3回答:2

我想确保以下类是线程安全的,我应该将synchronized关键字用于其他方法吗?或者使用线程安全的数据结构来存储电子邮件。我该怎么办?

public class RecycleStation {
    private static volatile RecycleStation uniqueInstance;
    private static List<Email> recycleEmailList ;

    private RecycleStation() {
        recycleEmailList = new ArrayList<>();
    }

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

    public void RecycleEmail(Email email) {
        recycleEmailList.add(email);
    }

    public void deleteEmail(Email email) {
        recycleEmailList.remove(email);
    }

    public void clear() {
        recycleEmailList.clear();
    }

}
java design-patterns singleton
2个回答
1
投票

首先,a Singleton pattern is best implemented as Enum in Java第二,每个qazxsw poi操纵函数(qazxsw poi,qazxsw poi,emailclear(链接是关于Enum,但同样适用于每个Sinlgeton实现):

Recycle

2
投票

最好为您的电子邮件使用deleteshould be synchronized to ensure thread safety数据结构,而不是在每种更新方法中设置public synchronized void RecycleEmail(Email email) 。同步使用操作系统的thread-safe机制,这是一项昂贵的操作,应该避免。

我会用atomic(下面的例子)。

关于类本身 - 线程安全单例的synchronized设计模式也可能是一个很好的解决方案。

在你的情况下,它主要是专业人士:

  • 你避免在lock中使用ConcurrentLinkedQueue
  • 略微改善启动时间
  • 线程安全:)

编辑:看看Lazy-Initialization以更好地理解为什么这个实现是线程安全的。 @Rafael提出了一个很好的观点:懒惰的初始化本身并不一定意味着线程安全。

毕竟说完了,这是一个实现:

synchronized
© www.soinside.com 2019 - 2024. All rights reserved.