gpt4 book ai didi

java - 如何保护单例类方法在 Java 中是线程安全的?

转载 作者:行者123 更新时间:2023-11-30 09:50:47 26 4
gpt4 key购买 nike

我有一个线程安全的双重检查单例类,它在单例类中包含一个带有 get/set/size 方法的 LinkedList。然后我有一个简单的池类,它使用这个 Singleton 类来管理对象池。

我的问题是如何在不使用同步方法的情况下保护单例和池类中的 get/set 方法。这是我的代码

public class SingletonDoubleCheckedLockingPattern {

private static SingletonDoubleCheckedLockingPattern s = new SingletonDoubleCheckedLockingPattern();

private LinkedList<Object> linkedList;

public int GetListObjectCount() {
return linkedList.size();
}

public Object GetObjectFromList() {
return linkedList.poll();
}

public void SetObjectFromList(Object ee) {
linkedList.add(ee);
}

private SingletonDoubleCheckedLockingPattern() {

linkedList = new LinkedList<Object>();

}

/**
* SingletonHolder is loaded on the first execution of
* Singleton.getInstance() or the first access to SingletonHolder.INSTANCE,
* not before.
*/
private static class SingletonHolder {
public static final SingletonDoubleCheckedLockingPattern INSTANCE = new SingletonDoubleCheckedLockingPattern();
}

public static SingletonDoubleCheckedLockingPattern getInstance() {
return SingletonHolder.INSTANCE;
}

// avoid cloning
public final Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}

}

public class SingletonObjectPool {

private int maxlistValue = 10;


public Object GetObject()
{
int listCount = SingletonDoubleCheckedLockingPattern.getInstance().GetListObjectCount();
if(listCount > 0)
{
return SingletonDoubleCheckedLockingPattern.getInstance().GetObjectFromList();
}
return null;
}


public void SetObject()
{
int listCount = SingletonDoubleCheckedLockingPattern.getInstance().GetListObjectCount();
if(listCount < maxlistValue)
{
SingletonDoubleCheckedLockingPattern.getInstance().SetObjectFromList(new Object());
}

}


}

最佳答案

您可以使用线程安全的 BlockingQueue。在尝试删除元素之前,您不需要检查集合是否为空,集合有执行此操作的方法。

要简化您的代码并使其成为线程安全的,您可以这样做。

public class SingletonObjectPool  {
private static final int maxlistValue = 10;
private static final BlockingQueue queue
= new ArrayBlockingQueue(maxListValue);

public static Object getObject() {
return queue.poll();
}


public static void addObjectAsRequired() {
queue.offer(new Object());
}
}

关于java - 如何保护单例类方法在 Java 中是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4991756/

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