[자바 디자인패턴 소스코드] Singleton Pattern

싱글톤패턴


/**
 * [싱글톤 패턴]
 * 인스턴스가 오직 하나만 생성되는 것을 보장하고
 * 어디서든 이 인스턴스에 접근할 수 있또록 하는 디자인 패턴
 *
 * as-is: Thread safe Lazy initialization (스레드 안전한 늦은 초기화)을 주석처리하고
 * to-be: Initialization on demand holder idiom (holder에 의한 초기화) 로 변경
 *
 * to-be식 방법은 가장 많이 사용되는 방법이다.
 * jvm은 class가 로드되는 시점에 원자성을 보장함.
 */
public class Singleton {
    public static void main(String[] args) {
        Bank bank1 =  Bank.getBank();
        Bank bank2 =  Bank.getBank();
        Bank bank3 =  Bank.getBank();
        Bank bank4 =  Bank.getBank();
        Bank bank5 =  Bank.getBank();
        Thread thread1 = new Thread(bank1);
        Thread thread2 = new Thread(bank2);
        Thread thread3 = new Thread(bank2);
        Thread thread4 = new Thread(bank2);
        Thread thread5 = new Thread(bank2);

        thread1.start();
        thread2.start();
        thread3.start();
        thread4.start();
        thread5.start();
    }
}

class Bank implements Runnable {
    //private static Bank bank = null;
    private static int no = 0;
    private Bank() {}

    static class LazyHolder {
        static final Bank INSTANCE  = new Bank();
    }

    public static Bank getBank() {
        return LazyHolder.INSTANCE;
    }

    /*
    public synchronized static Bank getBank() {
        if(bank == null) {
            bank = new Bank();
        }
        return bank;
    }
    */

    public void sendMoney(int amount) {
        synchronized (this) {
            no++;
            System.out.println(no + ") " + this.hashCode() + " : " + amount);
        }
    }

    @Override
    public void run() {
        sendMoney(1000);
    }
}

이 글을 공유하기

댓글

Designed by JB FACTORY