멀티 스레딩 환경에서의 Singleton 사용 및 견고한 Singleton 구현 방법 (Enum Singleton)
Singleton? Singleton pattern은 특정 인스턴스에 대하여 단일 인스턴스만 만들어질 수 있도록 제한하는 패턴이다. 스레드 풀이나 캐시, 네트워크 모듈 등등에서 같은 객체를 여러개 만드는 것은 불필요한 자원을 할당하며 예기치 않은 오류를 불러올 수 있는데, 이런 상황에서 singleton을 사용하여 하나의 인스턴스만을 생성하여 사용하도록 관리를 해주면 불필요한 메모리 낭비를 줄일 수 있고 사용성 측면에서도 효율적이라 자주 쓰이는 패턴중에 하나이다. 자주 사용하던 방식은 이런 방식이다. 이렇게 되면 생성자가 private이라 무조건 getInstance() 를 통해서만 인스턴스에 접근할 수 있기 때문에 mInstance == null 인 최초 상황에서만 초기화가 되며 그 이후에는 생성된 기존의 인스턴스를 사용하게 된다. 그러나 과연 'Singleton'을 보장할 수 있을까? 일단 기본적으로 Android는 멀티 스레딩 환경이다. 만약 A thread와 B thread에서 동시에 이 인스턴스에 접근하려고할 때 마침 mInstance 가 null이였다면, A thread에서도 mInstance == null 를 타기 때문에 mInstance 를 새로 할당할거고 B thread에서도 mInstance == null 를 타며 새로 할당하게 될 것이다. 그렇게 되면 예상했던 것과는 달리 mInstance 가 2개 이상의 중복 생성이 되며 예상하지 못한 오류를 만들어낼 수도 있다. 일단 해결책으로, Main thread에서만 접근하도록 제어할 수도 있을 것이다. 다른 스레드에서 접근하면 Exception을 날린다던가 하는 식으로 예외처리를 할 수 있지만, 만약 이 singleton 객체가 꼭 멀티 스레딩 환경에서도 사용가능하게끔 해야 한다면?? 그래서 나온 해결책이 getInstance() 를 synchronized ...