์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[๋””์ž์ธํŒจํ„ด] ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด

CS/๋””์ž์ธํŒจํ„ด OOP

by :ํ•ดํ”ผ๋ž˜๋น—๐Ÿพ 2024. 5. 1. 12:00

๋ณธ๋ฌธ

1. ์ฆ‰์‹œ ์ดˆ๊ธฐํ™”

public class IdGnerator {
    private AtomicLong id = new AtomicLong(0);
    private static final IdGenerator instance = new IdGenerator();
    
    private IdGenerator() {}
    public static IdGenerator getInstance() {
    	return instance;
    }
    
    public long getId() {
    	return id.incrementAndGet();
    }
}

 

2. ๋Šฆ์€ ์ดˆ๊ธฐํ™”

public class IdGnerator {
    private AtomicLong id = new AtomicLong(0);
    private static IdGenerator instance;
    
    private IdGenerator() {}
    
    public static synchronized IdGenerator getInstance() {
    	if(instance == null) {
        	instance = new IdGenerator();
        }
    	return instance;
    }
    
    public long getId() {
    	return id.incrementAndGet();
    }
}

- ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ดˆ๊ธฐํ™” ์ž‘์—…์ด ์ธ์Šคํ„ด์Šค๊ฐ€ ์‚ฌ์šฉ๋˜๊ธฐ ์ง์ „์— ์ด๋ฃจ์–ด์ง€๋ฉด ์„ฑ๋Šฅ์ƒ ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ

- synchronized ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, IdGenerator ํด๋ž˜์Šค์˜ ์‚ฌ์šฉ ๋นˆ๋„๊ฐ€ ๋†’๋‹ค๋ฉด ์ž์ฃผ ์ž ๊ธˆ์ด ์ผ์–ด๋‚˜๊ณ  ์ด๋กœ ์ธํ•ด ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ

 

3. ์ด์ค‘ ์ž ๊ธˆ

- ๋Šฆ์€ ์ดˆ๊ธฐํ™” ๋ฐฉ์‹ + ๋‚ฎ์€ ๋™์‹œ์„ฑ์„ ํ•ด๊ฒฐ

public class IdGenerator {
    private AtomicLong id = new AtomicLong(0);
    private static IdGenerator instance;
    
    private IdGenerator() {}
	
    public static IdGenerator getInstance() {
    	if(instance == null) {
        	synchronized(IdGenerator.class) {
            	if(instance == null) {
                	instance = new IdGenerator();
                }
            }
        }
        return instance;
    }
    
    public long getId() {
    	return id.incrementAndGet();
    }
}

- CPU ๋ช…๋ น์ด ์žฌ์ •๋ ฌ๋˜๋ฉด

IdGenerator ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ new ์˜ˆ์•ฝ์–ด๋ฅผ ํ†ตํ•ด instance ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๊ฐ€ ์ง€์ •๋”˜ ํ›„,

์ดˆ๊ธฐํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง€๊ธฐ ์ „์— ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์ด ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Œ

- volatile ํ‚ค์›Œ๋“œ๋ฅผ ์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋ช…๋ น์–ด ์žฌ์ •๋ ฌ ๋ฐฉ์ง€

 

4. ํ™€๋”์— ์˜ํ•œ ์ดˆ๊ธฐํ™”

- ์ง€์—ฐ ๋กœ๋”ฉ + ์Šค๋ ˆ๋“œ ์•ˆ์ •์„ฑ 

- ์ •์  ๋‚ด๋ถ€ ํด๋ž˜์Šค ํ™œ์šฉ

public class IdGenerator {
	private AtomicLong id = new AtomicLong(0);
    private IdGenerator() {}
    private static class SingletonHolder {
    	private static final IdGenerator instance = new IdGenerator();
    }
    public static IdGenerator getInstance() {
    	return SingletonHolder.instance;
    }
    public long getId() {
    	return id.incrementAndGet();
    }
}

IdGenerator ์ ์žฌ ์‹œ์ ์—๋Š” SingetonHolder๋Š” ์ ์žฌ๋˜์ง€ ์•Š์ง€๋งŒ,

getInstance()๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ํ˜ธ์ถœ๋ ๋•Œ ์ ์žฌ๋˜๊ณ  ์ƒ์„ฑ๋œ๋‹ค

๋”ฐ๋ผ์„œ JVM์— ์˜ํ•ด ์ธ์Šคํ„ด์Šค์˜ ์œ ์ผ์„ฑ๊ณผ ์ƒ์„ฑ ํ”„๋กœ์„ธ์Šค์˜ ์Šค๋ ˆ๋“œ ์•ˆ์ •์„ฑ์ด ๋ณด์žฅ๋œ๋‹ค

 

5. ์—ด๊ฑฐ

- enum ํ™œ์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์‹œ ์Šค๋ ˆ๋“œ ์•ˆ์ •์„ฑ๊ณผ ์œ ์ผ์„ฑ์„ ๋ณด์žฅํ•จ

public enum IdGenerator {
	INSTANCE;
    private AtomicLong id = new AtomicLong(0);
    public long getId() {
    	return id.incrementAndGet();
    }
}

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€

ํด๋ž˜์Šค ๊ฐ„์˜ ์˜์กด์„ฑ์„ ๊ฐ์ถ˜๋‹ค

์ฝ”๋“œ์˜ ํ™•์žฅ์„ฑ/ํ…Œ์ŠคํŠธ์— ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ์ƒ์„ฑ์ž๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค

 

๋Œ€์•ˆ ? ํŒฉํ„ฐ๋ฆฌ ํŒจํ„ด, DI ์ปจํ…Œ์ด

728x90

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ