리눅스에서는 이전부터 OpenJDK를 사용하였는데, Windows에서도 사용할 수 있도록 오픈되었네요.
https://github.com/ojdkbuild/ojdkbuild
앞으로는 OpenJDK를 사용해야 할 듯...
Great Architect & Artist
지혜 있는 자는 궁창의 빛과 같이 빛날 것이요 많은 사람을 옳은 데로 돌아오게 한 자는 별과 같이 영원토록 빛나리라 (단 12:3)
package com.dev.sampleClass Loading 시점에 Singleton Class Instance가 생성된다. 가장 쉽게 Signleton Class를 생성하는 방법이지만, Client에서 요청이 없을 때에도 항상 생성되므로 불필요한 리소스를 사용하게 된다. 또한 대부분 파일 시스템이나 데이터베이스에 접속하는 경우 Singleton Class를 사용하는데 Exception을 처리할 수 없다.
public class EagerInitSingleton {
private static final EagerInitSingleton = new EagerInitSingleton();
private EagerInitSingleton () {}
public static EagerInitSingleton getInstance() {
return instance;
}
}
package com.dev.sample
public class StaticBlockSingleton {
private static StaticBlockSingleton instance;
private StaticBlockSingleton () {}
static {
try {
instance = new StaticBlockSingleton();
}
catch (Exception e) {
throw new RuntimeException(e.printStackTrace());
}
}
public static StaticBlockSingleton getInstance() {
return instance;
}
}
package com.dev.sampleSingle Thread 환경에서 잘 동작한다. 하지만, 동시에 여러 개의 Thread가 접근할 경우 여러 개의 Instance가 생성될 수 있다. 그런 경우 Singleton Pattern이 깨지고, 서로 다른 Singleton Instance를 사용하게 될 수 있다.
public class LazyInitSingleton {
private static LazyInitSingleton instance;
private LazyInitSingleton() {}
public static LazyInitSingleton getInstance() {
if (instance == null) {
instance = new LazyInitSingleton();
}
return instance;
}
}
package com.dev.samplesynchronized 키워드를 사용하여 한번에 하나의 Thread만 호출할 수 있도록 만들 수 있다. 하지만 모든 Thread의 요청에 대해 synchronized를 실행하므로 성능상 오버헤드가 발생한다.
public class ThreadSafeSingleton {
private static ThreadSafeSingleton instance;
private ThreadSafeSingleton() {}
public static synchronized ThreadSafeSinfleton getInstance() {
if (instance == null) {
instance = new ThreadSafeSingleton();
}
return instance;
}
}
package com.dev.sample위와 같은 Double Checked Locking 원리를 이용하면, 조건을 만족시키는 경우 (instance == null) 한 번만 synchronized block이 실행되므로 하나의 Singleton Class Instance만 생성된다. synchronized로 인한 성능 이슈를 해소할 수 있다.
public class DoubleCheckThreadSafeSingleton {
private static DoubleCheckThreadSafeSingleton instance;
private DoubleCheckThreadSafeSingleton() {}
public static DoubleCheckThreadSafeSingleton getInstance() {
if(instance == null) {
synchronized (DoubleCheckThreadSafeSingleton.class) {
if (instance == null) {
instance = new DoubleCheckThreadSafeSingleton();
}
}
}
return instance;
}
}
package com.dev.samplegetInstance() method를 호출 할 때, SingletonHelper 클래스가 생성되고 Singleton intance는 static final 키워드로 인해 한번만 생성된다. 대부분 <6>번의 경우를 많이 사용한다.
public class HelperSingleton {
private HelperSingleton() {}
private static class SingletonHelper {
private static final HelperSingleton instance = new HelperSingleton();
}
public static HelperSingleton getInstance() {
return SingletonHelper.instance;
}
}
댓글을 달아 주세요
댓글 RSS 주소 : http://www.yongbi.net/rss/comment/837