싱글턴 패턴
- 인스턴스가 하나뿐인 특별한 객체
위 코드에서 MySinlgleton() 은 같은 패키지 내에서는 사용이 가능하나, 다른 패키지에서는 인스턴스를 만들 수 없는 클래스이다.
그 이유는 생성자가 private로 선언되어 있기 때문이다.
다른 패키지에서 사용하기 위해서는 getinstance() 라는 정적 메소드를 만들어서 사용 하면 된다.
MySinlgleton.getinstance(); 를 호출하게 되면 인스턴스를 계속 만들 수 있는 것이다.
하지만 하나뿐인 인스턴스 객체를 만들고 다면, 이렇게 하면, 조건문을 통해 생성되어있는지 없는지를 구별하여 반환하기 때문에 싱글턴패턴이 된다. 하지만 여기서 끝나는 것이 아니다.
만약 두개의 스레드가 위 코드를 실행하게 된다면, 내 의도와는 상관없이 두개의 인스턴스(Object1, Object2)가 생성되게 되버린다.
문제 해결방안에는
1. getinstance()를 동기화 시키는 것이다.
-synchronized 키워드만 붙이면 한 스레드가 메소드 사용을 끝내기 전까지는 다른 스레드는 메소드를 사용할수가 없게된다. 따라서 동시에 실행될 수가 없다.
-단 속도 문제가 생길 수 있다.(오버헤드)
2. 인스턴스를 처음부터 만들어 버린다
-정적 초기화 부분에서 Singleton의 인스턴스를 생성한다
-JVM에서 유일한 인스턴스를 생성하기 전에는 그 어떤 스레드도 uniqueinstance 정적 변수에 접근할 수 없다.
3. Double-Checking Locking(DCL)을 써서 getinstance()에 동기화한다.
-인스턴스가 생성되어 있는지 확인한 다음 생성되어 있지 않았을때만 동기화한다.
-처음에만 동기화를 하고 나중에는 동기화를 할 필요가 없다
-이렇게 함으로써 속도문제가 개선되고, 오버헤드를 줄이게 된다.
'JAVA' 카테고리의 다른 글
Signed와 Unsigned의 차이. (0) | 2013.10.07 |
---|---|
퍼스펙티브(perspective) (0) | 2013.10.01 |
jericho parsing(제리코 파싱)맛보기... (0) | 2012.07.19 |
JSON 형식 맛보기 ... (0) | 2012.07.19 |
JSON 형식(JavaScript Object Notation) (0) | 2012.07.19 |