싱글 톤 클래스에서 get/set/size 메서드를 사용하여 LinkedList를 보유하는 스레드 안전 이중 검사 Singleton 클래스가 있습니다. 그런 다음이 Singleton 클래스를 사용하여 객체 풀을 관리하는 간단한 풀 클래스가 있습니다.싱글 톤 클래스 메서드를 Java에서 스레드로부터 안전하게 보호하려면 어떻게해야합니까?
제 질문은 동기화 방법을 사용하지 않고 싱글 톤 및 풀 클래스에서 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());
}
}
}
후자가 정확한 철자이므로 검색을 위해 참조를 "단일 톤"에서 "싱글 톤"으로 업데이트했습니다. –
이중 확인 된 잠금 패턴을 사용하고 있지 않습니다. 이는 문제가 아닙니다. 클래스 내에서 하나와 홀더 내에서 두 개의 인스턴스를 생성합니다 ... – pgras