class A {
private A(){
//초기화
}
public static A getInstance() {
return LazyHolder.INSTANCE;
}
public static void doSomething() {
//할거
}
private static class LazyHolder() {
private static final class INSTANCE = new A();
}
}
이런 코드가 있을 때
클래스 생성에는 스레드간의 안전성을 보장해준다고하는데
서로 다른 두 스레드가 doSomething()을 호출할 때에도 스레드간의 안전성이 보장되나요?
아니면 뭐 할때마다 싱크로나이즈드나 록 걸어야됨?
private A(){
//초기화
}
public static A getInstance() {
return LazyHolder.INSTANCE;
}
public static void doSomething() {
//할거
}
private static class LazyHolder() {
private static final class INSTANCE = new A();
}
}
이런 코드가 있을 때
클래스 생성에는 스레드간의 안전성을 보장해준다고하는데
서로 다른 두 스레드가 doSomething()을 호출할 때에도 스레드간의 안전성이 보장되나요?
아니면 뭐 할때마다 싱크로나이즈드나 록 걸어야됨?
멀티스레드에 안전하다고 떠드는 싱글톤 구현들 중 실제로 멀티스레드에 안전한 구현은 없음. 이펙티브 자바에 보면 나옴.
당연히 안전하지 않음 니 코드도
놉 멀티스레드에서 함수 자체는 안정성 보장 못함
그럼 저거 호출할때마다 록 걸어야되는것?
싱글톤에 final 쓴 경우는 생성할때 안정성 보장 되지 싶은데?
아니 잠시만? 질문의 내용이 섞인 거 같은데
생성할때 보장된다고 예제로 나온 코드가 본문건데요 생성할때말고 메소드 호출할때도 보장되는지가 궁금했음..
결국은, 멀티스레드에서 싱글톤이 보장되냐는 얘기야? 아니면 뭐야 시발
싱글톤이고 자시고 간에 doSomething은 멀티스레드에 안전하지 않지
결국엔 호출할때마다 록걸어야된다는 소리네요 ㄱㅅㄱㅅ
멀티쓰레드에 안전한 싱글톤 구현 할 수 있음. 싱크걸고 개지랄 안떨어도됨;; 하지만 일반적으로는 enum을 쓰는걸 "권장" 하는거임
쓸데없이 static이 필요한 이유좀
asdf // effecitive java 같은 책 좀 봤다고 깝ㄴㄴ. 그 책의 방법이 모든 정답은 아님. reflection을 의식하지 않는다면 멀티쓰레드 환경에서 안전한 싱글톤 충분히 구현 가능함.
DCL 검색좀 해보셈 제발
개답답 ㅅㅂㅅㅂ
아 얘는 아니구나 미안 ^^
질문을 자꾸 헷갈렸음...
asdf // 나한테 얘기하는거니? dcl이 어쨌다는거냐
싱글턴 구현에서 멀티스레드라, 생성땐 안전하겠지만 호출은?
힣 이새끼는 싱글톤 패턴을 모르네