我想确保以下类是线程安全的,我应该将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();
}
}
首先,a Singleton pattern is best implemented as Enum in Java第二,每个qazxsw poi操纵函数(qazxsw poi,qazxsw poi,email
)clear
(链接是关于Enum,但同样适用于每个Sinlgeton实现):
Recycle
最好为您的电子邮件使用delete
,should be synchronized to ensure thread safety数据结构,而不是在每种更新方法中设置public synchronized void RecycleEmail(Email email)
。同步使用操作系统的thread-safe
机制,这是一项昂贵的操作,应该避免。
我会用atomic
(下面的例子)。
关于类本身 - 线程安全单例的synchronized
设计模式也可能是一个很好的解决方案。
在你的情况下,它主要是专业人士:
lock
中使用ConcurrentLinkedQueue
编辑:看看Lazy-Initialization以更好地理解为什么这个实现是线程安全的。 @Rafael提出了一个很好的观点:懒惰的初始化本身并不一定意味着线程安全。
毕竟说完了,这是一个实现:
synchronized