Singleton ํŒจํ„ด๊ณผ Thread Safety

์˜์„ยท2025๋…„ 5์›” 13์ผ

Java

๋ชฉ๋ก ๋ณด๊ธฐ
2/3
post-thumbnail

๐ŸงฎThread Safety

์“ฐ๋ ˆ๋“œ ์„ธ์ดํ”„ํ‹ฐ(Thread Safety), ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์–ด๋–ค ๊ณต์œ  ์ž์›(shared resource)์— ์ ‘๊ทผํ•˜๋”๋ผ๋„ ํ”„๋กœ๊ทธ๋žจ์ด ์ž˜๋ชป๋œ ๋™์ž‘์„ ํ•˜์ง€ ์•Š๋„๋ก ๋ณด์žฅ๋˜๋Š” ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์ ์šฉํ•˜๋ฉฐ

public class ObjectMapperHolder {
    private static class SingletonHolder {
        private static final ObjectMapper objectMapper = new ObjectMapper();
    }

    public static ObjectMapper getInstance() {
        return SingletonHolder.objectMapper;
    }
}

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋ณธํ”„๋กœ์ ํŠธ์™€ ๋…๋ฆฝ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ๊ธฐ๋Šฅ(ObjectMapper, etc)๋“ค์ด ์ƒ๊ฒจ๋‚˜์„œ ๋”ฐ๋กœ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋ชจ๋“  ํด๋ž˜์Šค๋ฅผ ์‹ฑ๊ธ€ํ†คํŒจํ„ด์œผ๋กœ ๊ด€๋ฆฌํ•ด๋„ ๋˜๋Š”๊ฑธ๊นŒ?

๐Ÿšจ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์ ์šฉ์•ˆ๋˜๋Š” ๊ฒฝ์šฐ!

  • ํด๋ž˜์Šค๊ฐ€ ์ƒํƒœ(status)๋ฅผ ๊ฐ€์ง€๋Š”๊ฒฝ์šฐ
  • ๋‚ด๋ถ€ ๊ฐ’์ด ์ž์ฃผ ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ

๋‘˜๋‹ค ๋น„์Šทํ•œ ๋ง์ด๋‹ค, ๊ฒฐ๊ตญ์€ ๋‚ด๋ถ€๊ฐ’์ด ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์“ฐ๋ ˆ๋“œ ์„ธ์ดํ”„ํ‹ฐ๊ฐ€ ๊นจ์ง„๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž

UnsafeSingleton.java

public class UnsafeSingleton {
    private static final UnsafeSingleton INSTANCE = new UnsafeSingleton();

    private String status; // ์ƒํƒœ๊ฐ’!

    private UnsafeSingleton() {}

    public static UnsafeSingleton getInstance() {
        return INSTANCE;
    }

    // getter, setter
}

Executor.java

UnsafeSingleton singleton = UnsafeSingleton.getInstance();

Thread t1 = new Thread(() -> singleton.setStatus("๊ณ ๊ธฐ ๋จน์ž"));
Thread t2 = new Thread(() -> singleton.setStatus("ํ–„๋ถ€๊ธฐ ๋จน์ž"));

t1.start();
t2.start();

// ๊ฒฐ๊ณผ๊ฐ’์€???
System.out.println(singleton.getStatus());

์ด์™€ ๊ฐ™์€ ๊ฒฝ์šฐ, .getStatus() ๊ฐ€ ์–ด๋–ค ๊ฐ’์„ ๋ฐ˜ํ™˜ํ• ์ง€๋Š” ์˜ˆ์ธกํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ ์ด์œ ๋Š”.getStatus()์˜ ๋ฐ˜ํ™˜๊ฐ’์€ Thread t1,t2 ์‹คํ–‰์ด ์™„๋ฃŒ๋˜๋Š” ์‹œ์ ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Singleton์€ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์ผํ•œ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์˜๋„ํ•˜์ง€ ์•Š๊ฒŒ ์ƒํƒœ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰ Singleton๋ณด๋‹ค๋Š” ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ๊ด€๋ฆฌํ•˜๋Š”๊ฒŒ ์ ํ•ฉํ•ด ๋ณด์ž…๋‹ˆ๋‹ค!

๊ฒฐ๋ก 

Singleton ํŒจํ„ด์ด ์ ์šฉ๋œ ํด๋ž˜์Šค๋Š” ๋‚ด๋ถ€ ์ƒํƒœ๊ฐ€ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€๋˜์–ด์•ผ ํ•˜๋ฉฐ, ๊ฐ’์ด ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์›์น™์€ ์Šค๋ ˆ๋“œ ์„ธ์ดํ”„ํ‹ฐ(Thread Safety) ๋ฅผ ๋ณด์žฅํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

profile
๋А๋ฆฌ๊ฒŒ ๊ฐฑ์‹ ๋˜๋Š” ๊ฐœ๋ฐœ์‹ค๋ ฅ - >_0

0๊ฐœ์˜ ๋Œ“๊ธ€