๋™์‹œ์„ฑ๊ณผ ๊น”๋”ํ•œ ์ฝ”๋“œ๋Š” ์–‘๋ฆฝํ•˜๊ธฐ ์•„์ฃผ ์–ด๋ ต๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ๋™์‹œ์„ฑ์€ ์™œ ํ•„์š”ํ• ๊นŒ?

๊ฐ์ฒด๋Š” ์ฒ˜๋ฆฌ์˜ ์ถ”์ƒํ™”๋‹ค. ์Šค๋ ˆ๋“œ๋Š” ์ผ์ •์˜ ์ถ”์ƒํ™”๋‹ค. - ์ œ์ž„์Šค O. ์ฝ”ํ”Œ๋ฆฌ์—”

๋™์‹œ์„ฑ์ด ํ•„์š”ํ•œ ์ด์œ ?

๋™์‹œ์„ฑ์€ โ€œ๋ฌด์—‡โ€๊ณผ โ€œ์–ธ์ œโ€์˜ Coupling์„ ์—†์• ๋Š” ์ „๋žต์ด๋‹ค.

์Šค๋ ˆ๋“œ๊ฐ€ ํ•˜๋‚˜์ธ ํ”„๋กœ๊ทธ๋žจ์€, ๋ฌด์—‡๊ณผ ์–ธ์ œ๊ฐ€ ๋ฐ€์ ‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, call stack์„ ์‚ดํŽด๋ณด๋ฉด ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒํƒœ๋ฅผ ๋ฐ”๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋ฌด์—‡๊ณผ ์–ธ์ œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์กฐ์™€ ํšจ์œจ์ด ๊ทน์ ์œผ๋กœ ๋‚˜์•„์ง„๋‹ค. ๊ฑฐ๋Œ€ํ•œ ํ•˜๋‚˜์˜ ๋ฃจํ”„๊ฐ€ ์•„๋‹ˆ๋ผ, ์ž‘์€ ํ˜‘๋ ฅ ํ”„๋กœ๊ทธ๋žจ ์—ฌ๋Ÿฟ์ด ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, java Subvlet ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ, ์›น ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ์›น ์„œ๋ฒ„๋Š” ๋น„๋™๊ธฐ์‹์œผ๋กœ ์„œ๋ธ”๋ฆฟ์„ ์‹คํ–‰ํ•œ๋‹ค.

์ด๋Ÿฐ ๊ตฌ์กฐ์ ์ธ ์ด์ ๋งŒ์„ ์œ„ํ•ด ๋™์‹œ์„ฑ์„ ์ฑ„ํƒํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์‘๋‹ต ์‹œ๊ฐ„, ์ž‘์—… ์ฒ˜๋ฆฌ๋Ÿ‰ ๊ฐœ์„ ์ด๋ผ๋Š” ์š”๊ตฌ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด ๋™์‹œ์„ฑ ๊ตฌํ˜„์„ ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ์„ ํƒํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.

๋ฏธ์‹ ๊ณผ ์˜คํ•ด

์˜ค๊ฐœ๋…ํ•ด์„ค
๋™์‹œ์„ฑ์€ ํ•ญ์ƒ ์„ฑ๋Šฅ์„ ๋†’์—ฌ์ค€๋‹ค.๋•Œ๋•Œ๋กœ ์„ฑ๋Šฅ์„ ๋†’์—ฌ์ค€๋‹ค.
์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์„œ๊ฐ€ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ๊ณ„์‚ฐ์ด ์ถฉ๋ถ„ํžˆ ๋งŽ์€ ๊ฒฝ์šฐ, ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๊ธด ๊ฒฝ์šฐ๊ฐ€ ์˜ˆ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.
๋™์‹œ์„ฑ์„ ๊ตฌํ˜„ํ•ด๋„ ์„ค๊ณ„๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.๋‹จ์ผ ์Šค๋ ˆ๋“œ ์‹œ์Šคํ…œ๊ณผ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ์‹œ์Šคํ…œ์€ ์„ค๊ณ„๊ฐ€ ํŒ์ดํ•˜๊ฒŒ ๋‹ค๋ฅด๋‹ค.
์›น ๋˜๋Š” EJB ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋™์‹œ์„ฑ์„ ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€, ์–ด๋–ป๊ฒŒ ๋™์‹œ ์ˆ˜์ •, ๋ฐ๋“œ๋ฝ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„์•ผ ํ•œ๋‹ค.

ํƒ€๋‹นํ•œ ์ƒ๊ฐ

ํƒ€๋‹นํ•œ ์ƒ๊ฐํ•ด์„ค
๋™์‹œ์„ฑ์€ ๋‹ค์†Œ ๋ถ€ํ•˜๋ฅผ ์œ ๋ฐœํ•œ๋‹ค.์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ๋ฉฐ, ์ฝ”๋“œ๋„ ๋” ์งœ์•ผ ํ•œ๋‹ค.
๋™์‹œ์„ฑ์€ ๋ณต์žกํ•˜๋‹ค.๊ฐ„๋‹จํ•œ ๋ฌธ์ œ๋”๋ผ๋„ ๋™์‹œ์„ฑ์€ ๋ณต์žกํ•˜๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ ๋™์‹œ์„ฑ ๋ฒ„๊ทธ๋Š” ์žฌํ˜„ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.์ง„์งœ ๊ฒฐํ•จ์ด ์•„๋‹ˆ๊ณ , ์ผ์‹œ์„ฑ ๋ฒ„๊ทธ๋กœ ์—ฌ๊ธฐ๊ธฐ ์‰ฝ๋‹ค.
๋™์‹œ์„ฑ์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ํ”ํžˆ ๊ทผ๋ณธ์ ์ธ ์„ค๊ณ„ ์ „๋žต์„ ๋‹ค์‹œ ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค.

๋‚œ๊ด€

๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ์–ด๋ ค์šด ๊ฒƒ์ผ๊นŒ?

public class ClassWithThreadingProblem {
    private int lastIdUsed;
    
    public ClassWithThreadingProblem(int lastIdUsed) {
        this.lastIdUsed = lastIdUsed;
    }
    
    public int getNextId() {
        return ++lastIdUsed;
    }
}
 
public static void main(String args[]) {
    final ClassWithThreadingProblem classWithThreadingProblem = new ClassWithThreadingProblem(42); // 1. instance ์ƒ์„ฑ, ์ดˆ๊ธฐ๊ฐ’ 42 ์„ค์ •
    
    Runnable runnable = new Runnable() {
        public void run() {
            classWithThreadingProblem.getNextId();
        }
    };
    
    Thread t1 = new Thread(runnable); // ๋‘ ์Šค๋ ˆ๋“œ์—์„œ ํ˜ธ์ถœ โœ…
    Thread t2 = new Thread(runnable); // ๋‘ ์Šค๋ ˆ๋“œ์—์„œ ํ˜ธ์ถœ โœ…
    t1.start();
    t2.start();
}

์œ„ ์ฝ”๋“œ๊ฐ€ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฐ๊ณผ๋Š” ์ด 3๊ฐ€์ง€ ์ด๋‹ค.

  • t1์ด 43์„, t2๊ฐ€ 44๋ฅผ ๊ฐ€์ ธ๊ฐ„๋‹ค. lastIdUsed๋Š” 44์ด๋‹ค.(O)
  • t1์ด 44์„, t2๊ฐ€ 43๋ฅผ ๊ฐ€์ ธ๊ฐ„๋‹ค. lastIdUsed๋Š” 44์ด๋‹ค.(O)
  • t1์ด 43์„, t2๊ฐ€ 43๋ฅผ ๊ฐ€์ ธ๊ฐ„๋‹ค. lastIdUsed๋Š” 43์ด๋‹ค.(X)

์œ„์˜ getNextId() ๋ฉ”์„œ๋“œ๋Š” 8๊ฐœ์˜ ์ž๋ฐ” byte-code๋กœ ๋ณ€ํ™˜๋˜๋ฉฐ, ์ด๋ฅผ ๋‘ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ์ด 12,870๊ฐœ์˜ ์ฝ”๋“œ ์กฐํ•ฉ์„ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ์ค‘ ์–ผ๋งˆ ์•ˆ ๋˜๋Š” ๋ช‡๋ช‡ ์กฐํ•ฉ์ด ์œ„์˜ 3๊ฐ€์ง€ ๊ฒฐ๊ณผ ์ค‘ ๋งˆ์ง€๋ง‰ ๊ฒฐ๊ณผ๋ฅผ ๋‚ณ๊ฒŒ ๋œ๋‹ค.

๋™์‹œ์„ฑ ๋ฐฉ์–ด ์›์น™

๋™์‹œ์„ฑ ์ฝ”๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋กœ๋ถ€ํ„ฐ ์‹œ์Šคํ…œ์„ ๋ฐฉ์–ดํ•˜๋Š” ์›์น™๊ณผ ๊ธฐ์ˆ ์„ ์†Œ๊ฐœํ•œ๋‹ค.

๋‹จ์ผ ์ฑ…์ž„ ์›์น™(Single Responsibility Principle, SRP)

๋™์‹œ์„ฑ ์ฝ”๋“œ๋Š” ๋ถ„๋ฆฌํ•˜์ž.

SRP๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ, ๋ฉ”์„œ๋“œ/ํด๋ž˜์Šค/์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณ€๊ฒฝํ•  ์ด์œ ๊ฐ€ ํ•˜๋‚˜์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™์ด๋‹ค. ๋™์‹œ์„ฑ์€ ๋ณต์žก์„ฑ ํ•˜๋‚˜๋งŒ์œผ๋กœ๋„ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•  ์ด์œ ๊ฐ€ ์ถฉ๋ถ„ํ•˜๋‹ค.

  • Concurrency ๊ด€๋ จ ์ฝ”๋“œ๋Š” ๊ฐœ๋ฐœ, ๋ณ€๊ฒฝ, ํŠœ๋‹์‹œ ๋‹ค๋ฅธ ์ฝ”๋“œ์™€ ๋ถ„๋ฆฌ๋œ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง„๋‹ค.
  • Concurrency ๊ด€๋ จ ์ฝ”๋“œ๋Š” ๊ทธ ์ž์ฒด๊ฐ€ ๊ฐ€์ง€๋Š” ์–ด๋ ค์›€(ํ’€๊ธฐ ํž˜๋“  ๋ฌธ์ œ)์ด ์žˆ๋‹ค.
  • ์ž˜๋ชป ์ž‘์„ฑ๋œ concurrency ์ฝ”๋“œ๋Š” ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ถ”๊ฐ€์ ์ธ ์ฝ”๋“œ ์—†์ด ํ•ด๊ฒฐ๋˜๊ธฐ ํž˜๋“ค๋‹ค.

๋”ฐ๋ฆ„ ์ •๋ฆฌ(Corollary): ์ž๋ฃŒ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•˜๋ผ

์ž๋ฃŒ๋ฅผ ์บก์Šํ™” ํ•˜๋ผ. ๊ณต์œ  ์ž๋ฃŒ๋ฅผ ์ตœ๋Œ€ํ•œ ์ค„์ด๊ณ , ์ž„๊ณ„ ์˜์—ญ๋„ ์ค„์—ฌ๋ผ.

์œ„์˜ ์ฝ”๋“œ์—์„œ ๋ณด์•˜๋˜ ๋ฌธ์ œ๋Š” ๊ฐ์ฒด๋ฅผ ๊ณ ์œตํ•œ ์ƒํƒœ์—์„œ, ๋™์ผ ํ•„๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋˜ ๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ ์„œ๋กœ ๊ฐ„์„ญํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ๋‹ค. ์ฆ‰, ์„œ๋กœ ๊ฐ„์„ญํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•˜๋ฉด ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ๋œ๋‹ค. ์ด๋Ÿฐ ์ฝ”๋“œ์˜ ๋ถ€๋ถ„์„ ์ž„๊ณ„์˜์—ญ์ด๋ผ ํ•œ๋‹ค. ์ด๋Ÿฐ ์ž„๊ณ„์˜์—ญ์˜ ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ ๊ฒฝ์šฐ ๋‹ค์Œ์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

  • ๋ณดํ˜ธํ•  ์ž„๊ณ„ ์˜์—ญ์„ ๋นผ๋จน๋Š”๋‹ค.
  • ๋ชจ๋“  ์ž„๊ณ„์˜์—ญ์„ ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š๋ผ ๋˜‘๊ฐ™์€ ๋…ธ๋ ฅ๊ณผ ์ˆ˜๊ณ ๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค.
  • ์•ˆ๊ทธ๋ž˜๋„ ์ฐพ๊ธฐ ํž˜๋“ ๋ฐ, ๋งŽ์•„์ ธ์„œ ๋” ์ฐพ๊ธฐ ์–ด๋ ต๋‹ค.

๋”ฐ๋ฆ„ ์ •๋ฆฌ: ์ž๋ฃŒ ์‚ฌ๋ณธ์„ ์‚ฌ์šฉํ•˜๋ผ

Copy๋ฅผ ๋– ์„œ ์ฒ˜๋ฆฌํ•˜๋ฉด ์•ˆ์ „ํ•˜๋‹ค.

๊ณต์œ  ์ž๋ฃŒ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ? ์• ์ดˆ์— ๊ณต์œ ํ•˜์ง€ ์•Š์œผ๋ฉด ๋™์‹œ์„ฑ ๋ฌธ์ œ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋ณต์‚ฌํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ๋ก  ๋ณต์‚ฌ ๋น„์šฉ(memory, time)์ด ๋“ ๋‹ค๋Š” trade-off๊ฐ€ ์žˆ์ง€๋งŒ, ์ž˜ ์‚ฌ์šฉํ•˜๋ฉด ๋งค์šฐ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค.

๋”ฐ๋ฆ„ ์ •๋ฆฌ: ์Šค๋ ˆ๋“œ๋Š” ๊ฐ€๋Šฅํ•œ ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ผ

๋…์ž์  ์Šค๋ ˆ๋“œ, ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์„œ์—์„œ ๋™์ž‘ํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋„๋ก ์ž๋ฃŒ๋ฅผ ๋…๋ฆฝ์ ์ธ ๋‹จ์œ„๋กœ ๋ถ„ํ• ํ•˜๋ผ.

์Šค๋ ˆ๋“œ ๋‚ด๋ถ€์—์„œ ๋Œ์•„๊ฐ€๋Š” ์ฝ”๋“œ๊ฐ€ ๊ณต์œ  instance๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๋‚ด๋ถ€ local ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์ข‹๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์™€ ๋™๊ธฐํ™”ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ฆ‰, ์ˆœ์ˆ˜ํ•จ์ˆ˜๋กœ ์งœ๋ผ๋Š” ๋ง์ด๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋ผ

ํ•ด๋‹น ๋ถ€๋ถ„์€ java 5๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”์—†๋Š” ๋ถ€๋ถ„์€ ์ •๋ฆฌํ•˜์ง€ ์•Š์•˜๋‹ค.

์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์— ์•ˆ์ „ํ•œ ์ปฌ๋ ‰์…˜

์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋…์œ„์ฃผ๋กœ ์„ค๋ช…ํ•œ๋‹ค.

๋ฐฉ๋ฒ•์„ค๋ช…
Lockํ•œ ๋ฉ”์„œ๋“œ์—์„œ ์ž ๊ทธ๊ณ  ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ์—์„œ ํ‘ผ๋‹ค.
Semaphore์ „ํ†ต์ ์ธ ์„ธ๋งˆํฌ์–ด(๊ฐฏ์ˆ˜๋ฅผ ์…€ ์ˆ˜ ์žˆ๋Š” lock)์˜ ๊ตฌํ˜„์ฒด์ด๋‹ค.
CountDownLatch๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋“ค์„ ํ•ด์ œํ•˜๊ธฐ ์ „ ํŠน์ • ํšŸ์ˆ˜์˜ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” lock์ด๋‹ค. ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฑฐ์˜ ๋™์‹œ์— ์‹œ์ž‘๋  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค„ ์ˆ˜ ์žˆ๋‹ค.

์‹คํ–‰ ๋ชจ๋ธ์„ ์ดํ•ดํ•˜๋ผ

๊ธฐ๋ณธ ์šฉ์–ด๋ถ€ํ„ฐ ์ •๋ฆฌํ•ด๋ณด์ž.

๋ฐฉ๋ฒ•์„ค๋ช…
Bound Resourcesํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ์ž์›์ด๋‹ค. ์˜ˆ์‹œ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ, ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋ฒ„ํผ๊ฐ€ ์žˆ๋‹ค.
Mutual Exclusionํ•œ ์‹œ์ ์— ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์Šค๋ ˆ๋“œ๋Š” ๋‹จ ํ•˜๋‚˜์ด๋‹ค.
Starvationํ•œ ์Šค๋ ˆ๋“œ ํ˜น์€ ์Šค๋ ˆ๋“œ์˜ ๊ทธ๋ฃน์ด ๊ธด ์‹œ๊ฐ„ ํ˜น์€ ์˜์›ํžˆ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค. ์ž‘์—…์˜ ์šฐ์„ ๊ถŒ์„ ๊ฐ€์ง€๋Š” ์ˆ˜ํ–‰ ์‹œ๊ฐ„์ด ์งง์€ ์Šค๋ ˆ๋“œ๊ฐ€ ๋์—†์ด ์‹คํ–‰๋œ๋‹ค๋ฉด ์ˆ˜ํ–‰ ์‹œ๊ฐ„์ด ๊ธด ์Šค๋ ˆ๋“œ๋Š” ๊ตถ๊ฒŒ ๋œ๋‹ค.
Deadlock๋‘ ๊ฐœ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๋“ค์ด ์„œ๋กœ์˜ ์ž‘์—…์ด ๋๋‚˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ์„œ๋กœ๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ์ž์›์„ ์ ์œ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ํ•„์š”ํ•œ ์ž์›์„ ์–ป์ง€ ๋ชปํ•˜๋Š” ์ด์ƒ ๊ทธ ๋ˆ„๊ตฌ๋„ ์ž‘์—…์„ ๋๋‚ด์ง€ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค.
Livelock๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฝ์˜ ํ•ด์ œ์™€ ํš๋“์„ ๋ฌดํ•œ ๋ฐ˜๋ณตํ•˜๋Š” ์ƒํƒœ์ด๋‹ค. ์Šค๋ ˆ๋“œ๋“ค์ด ์„œ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ์ค‘ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž‘์—…์ค‘์ธ ๊ฒƒ์„ ์ธ์ง€ํ•˜๊ณ  ์„œ๋กœ ์–‘๋ณดํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ณต๋ช… ๋•Œ๋ฌธ์— ์Šค๋ ˆ๋“œ๋“ค์€ ์ž‘์—…์„ ๊ณ„์† ์ˆ˜ํ–‰ํ•˜๋ ค ํ•˜์ง€๋งŒ ์žฅ์‹œ๊ฐ„ ํ˜น์€ ์˜์›ํžˆ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค.

์ƒ์‚ฐ์ž-์†Œ๋น„์ž(Producer-Consumer)

์œ„์˜ ๊ทธ๋ฆผ์—์„œ ์ž˜๋ชปํ•˜๋ฉด ์ƒ์‚ฐ์ž๊ฐ€ ์ •๋ณด๋ฅผ ์ƒ์‚ฐํ•œ ์ดํ›„, ์†Œ๋น„์ž์—๊ฒŒ ์•Œ๋ฆผ์„ ๋ณด๋ƒˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์†Œ๋น„์ž๋Š” ๋‹ค์‹œ ์ƒ์‚ฐ์ž์—๊ฒŒ ๋Œ€๊ธฐ์—ด์„ ์ฑ„์šฐ๋ผ๋Š” ์š”์ฒญ์„ ๊ฑธ์–ด๋‘๊ณ  ์‘๋‹ต์„ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์ด ์ดˆ๋ž˜๋  ์ˆ˜ ์žˆ๋‹ค.

์ฝ๊ธฐ-์“ฐ๊ธฐ(Readers-Writers)

์“ฐ๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ ์ฝ๊ธฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์ฝ์ง€ ๋ชปํ•˜๊ฒŒ ํ•œ๋‹ค๋ฉด, ์ฒ˜๋ฆฌ์œจ์— ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ๊ธฐ์•„ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ์ฝ๊ธฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์ฝ๋Š” ๋™์•ˆ ์“ฐ๊ธฐ๊ฐ€ ๊ฐฑ์‹ ํ•˜๋Š” ๊ฒƒ๋„ ๋ชปํ•˜๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค.

์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ์ฝ๊ธฐ ์Šค๋ ˆ๋“œ์˜ ์š”๊ตฌ์™€ ์“ฐ๊ธฐ ์Šค๋ ˆ๋“œ์˜ ์š”๊ตฌ๋ฅผ ์ ์ ˆํžˆ ๋งŒ์กฑ์‹œํ‚ฌ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

์‹์‚ฌํ•˜๋Š” ์ฒ ํ•™์ž๋“ค(Dining Philosophers)

์›ํƒ์„ ๋‘˜๋Ÿฌ์‹ผ ์—ฌ๋Ÿฌ ๋ช…์˜ ์ฒ ํ•™์ž๋“ค์ด ์žˆ๋‹ค. ๊ฐ ์ฒ ํ•™์ž์˜ ์™ผ์ชฝ์— ์ “๊ฐ€๋ฝ์ด ๋†“์—ฌ ์žˆ์œผ๋ฉฐ ํ…Œ์ด๋ธ”์˜ ์ค‘์•™์— ํฐ ์Œ์‹์ด ๋†“์—ฌ ์žˆ๋‹ค. ๋ฐฐ๊ฐ€ ๊ณ ํŒŒ์ง€๋ฉด ๊ทธ๋“ค์€ ์ž์‹ ์˜ ์–‘์ชฝ์— ๋†“์—ฌ ์žˆ๋Š” ์ “๊ฐ€๋ฝ์„ ์žก๊ณ  ์ŠคํŒŒ๊ฒŒํ‹ฐ๋ฅผ ๋จน๋Š”๋‹ค.

์ “๊ฐ€๋ฝ์€ ๋‘์ง์ด ์žˆ์–ด์•ผ ๋น„๋กœ์†Œ ๋จน์„ ์ˆ˜ ์žˆ๋‹ค. ์˜† ์‚ฌ๋žŒ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉด ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค. ์ŠคํŒŒ๊ฒŒํ‹ฐ๋ฅผ ๋จน์€ ์ฒ ํ•™์ž๋Š” ๋‹ค์‹œ ๋ฐฐ๊ฐ€ ๊ณ ํŒŒ์งˆ ๋•Œ๊นŒ์ง€ ํฌํฌ๋ฅผ ๋†“๊ณ  ์žˆ๋Š”๋‹ค.

์œ„ ์ƒํ™ฉ์—์„œ ์ฒ ํ•™์ž๋ฅผ ์Šค๋ ˆ๋“œ๋กœ, ํฌํฌ๋ฅผ ๊ณต์œ  ์ž์›์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ์ด๋Š” ์ž์›์„ ๋†“๊ณ  ๊ฒฝ์Ÿํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์™€ ๋น„์Šทํ•œ ์ƒํ™ฉ์ด ๋œ๋‹ค. ๋ชจ๋‘๊ฐ€ ๋ฐฐ๊ฐ€ ๊ณ ํ”ˆ ์ƒํƒœ๊ฐ€ ๋˜์–ด ์™ผ์ชฝ์— ์žˆ๋Š” ์ “๊ฐ€๋ฝ ๋ถ€ํ„ฐ ์žก์„ ๊ฒฝ์šฐ, ๋ชจ๋‘๊ฐ€ ๋ฐฅ์„ ๋ชป๋จน๊ณ  ๊ตถ์–ด์ฃฝ๋Š” ๊ธฐ์•„์ƒํƒœ์— ๋น ์ง„๋‹ค. ์ด๋ ‡๊ฒŒ ์ž˜ ์„ค๊ณ„๋˜์ง€ ์•Š์€ ์‹œ์Šคํ…œ์€ deadlock, livelock, ์ฒ˜๋ฆฌ๋Ÿ‰ ๋ฌธ์ œ, ํšจ์œจ์„ฑ ์ €ํ•˜ ๋ฌธ์ œ์— ๋งž๋‹ฅ๋œจ๋ฆฌ๊ธฐ ์‰ฝ๋‹ค.

๋‹น์‹ ์ด ๋งž๋‹ฅ๋œจ๋ฆด ๋Œ€๋ถ€๋ถ„์˜ concurrent๊ด€๋ จ ๋ฌธ์ œ๋“ค์€ ์œ„์˜ ์„ธ ๊ฐ€์ง€ ๋ฌธ์ œ์˜ ๋ณ€ํ˜•์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์„ ๊ณต๋ถ€ํ•˜๊ณ  ์Šค์Šค๋กœ ํ•ด๋ฒ•์„ ์ž‘์„ฑํ•จ์œผ๋กœ์จ ์ด์™€ ๊ฐ™์€ ๋ฌธ์ œ๋“ค์„ ์ง๋ฉดํ•˜๋”๋ผ๋„ ์˜์—ฐํ•˜๊ฒŒ ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์ž.

๋™๊ธฐํ™”ํ•˜๋Š” ๋ฉ”์„œ๋“œ ์‚ฌ์ด์— ์กด์žฌํ•˜๋Š” ์˜์กด์„ฑ์„ ์ดํ•ดํ•˜๋ผ

๋™๊ธฐํ™”๋œ ๋ฉ”์„œ๋“œ ๊ฐ„์˜ ์˜์กด์„ฑ์€ ๋™์‹œ์„ฑ ์ฝ”๋“œ์—์„œ ์‚ฌ์†Œํ•œ ๋ฒ„๊ทธ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์ž๋ฐ”๋Š” synchronized๋ผ๋Š” โ€œ๋ฉ”์„œ๋“œ ํ•˜๋‚˜๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๋…ธํ…Œ์ด์…˜โ€์„ ์ œ๊ณตํ•œ๋‹ค. ํ•˜์ง€๋งŒ ํ•œ ํด๋ž˜์Šค์— ๋‘ ๊ฐœ ์ด์ƒ์˜ synchronized ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜๋„ ์žˆ๋‹ค. ์ฆ‰, synchronized ํ‚ค์›Œ๋“œ๊ฐ€ ๋‹ฌ๋ฆฐ ํ•จ์ˆ˜๋ฅผ ์˜์กด์„ฑ์ด ์žˆ๊ฒŒ ์ˆœ์ฐจ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ, ์‹œ์ ์— ์˜ํ–ฅ์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์ด๋‹ค.

/* Code 2-1: ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ƒํ™ฉ */
 
public class IntegerIterator implements Iterator<Integer> {
    private Integer nextValue = 0;
    
    public synchronized boolean hasNext() {
        return nextValue < 100000;
    }
    
    public synchronized Integer next() {
        if (nextValue == 100000)
            throw new IteratorPastEndException();
        return nextValue++;
    }
    
    public synchronized Integer getNextValue() {
        return nextValue;
    }
}
 
// Shared Resource
IntegerIterator iterator = new IntegerIterator();
 
// Threaded-Code
while(iterator.hasNext()) {
    // nextValue๊ฐ€ 99999์ธ ์ƒํ™ฉ์—์„œ ๋‘ ์Šค๋ ˆ๋“œ์—์„œ ์ˆœ์ฐจ์ ์œผ๋กœ while(iterator.hasNext())๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด
    // ๋‘ ์Šค๋ ˆ๋“œ ๋ชจ๋‘ while๋ฌธ ์•ˆ์œผ๋กœ ์ง„์ž…ํ•˜๊ฒŒ ๋œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•ด๋‹น ์กฐ๊ฑด๋งŒ ํ™•์ธํ•˜๋Š” ๋ฉ”์†Œ๋“œ์˜€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    // ์ด๋Š” ์˜ˆ์ƒ๋˜์ง€ ์•Š์€ ๊ฒฐ๊ณผ์ด๋‹ค.
    // ์ด๋ฏธ 100000์ดํ•˜์ธ ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•˜๊ณ  ์•„๋ž˜ ๋™์ž‘์„ ํ•˜๊ธธ ๋ฐ”๋ž๋Š”๋ฐ, ํ†ต๊ณผํ•ด๋ฒ„๋ฆฐ ๊ฒƒ์ด๋‹ค.
    int nextValue = iterator.next();
    // do something with nextValue
}

์ด๋Ÿฐ ์ƒํ™ฉ์ด๋ฉด synchronized ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ ๊ฐ€ ์—†๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ๋‹ค์Œ์˜ ์„ธ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•˜์ž.

ํด๋ผ์ด์–ธํŠธ ๊ธฐ๋ฐ˜ ์ž ๊ธˆ(Client-Based Locking)

๋จผ์ €, ๊ณต์œ  ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ชฝ ์ฝ”๋“œ์—์„œ ๊ณต์œ  ๊ฐ์ฒด๋ฅผ ์ž ๊ทธ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

/* Code 2-2: Client-Based Locking */
 
// Shared Resource
IntegerIterator iterator = new IntegerIterator();
 
// Threaded-Code
while (true) {
    int nextValue;
    synchronized (iterator) { โœ…
        if (!iterator.hasNext())
            break;
        nextValue = iterator.next();
    }
    doSometingWith(nextValue);
}

์‚ฌ์šฉํ•˜๋Š” ์ชฝ์—์„œ synchronized ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ thread๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์ ‘๊ทผํ•˜๊ณ , ๊ทธ ์•ˆ์—์„œ ์กฐ๊ฑด์„ ํƒ์ƒ‰ํ•˜๋„๋ก ํ–ˆ๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ, ์›ํ•˜๋Š” ๋ฐฉ์‹๋Œ€๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ๋“ค์–ด์˜ค๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์‚ฌ์‹ค ์ด ๋ฐฉ์‹์€ ์ข‹์ง€ ์•Š๋‹ค. ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์—์„œ lock์„ ํ•„์š”๋กœํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฒฝ๊ณ„์˜์—ญ์ด ํฉ์–ด์ ธ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์ด ์ƒ์Šนํ•œ๋‹ค.

์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ์ž ๊ธˆ(Server-Based Locking)

์ด๋ฒˆ์—๋Š” ์ œ๊ณตํ•˜๋Š” ์ชฝ์—์„œ lock์„ ๊ฑฐ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

/* Code 2-3: Server-Based Locking */
 
public class IntegerIteratorServerLocked {
    private Integer nextValue = 0;
    
    public synchronized Integer getNextOrNull() { โœ…
        if (nextValue < 100000)
            return nextValue++;
        else
            return null;
    }
}
 
// Shared Resource
IntegerIterator iterator = new IntegerIterator();
 
// Threaded-Code
while (true) {
    Integer nextValue = iterator.getNextOrNull();
    if (next == null)
        break;
    // do something with nextValue
}

๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์กฐ๊ฑด์„ ํƒ์ƒ‰ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋‚ด๋ถ€๋กœ ๋„ฃ์–ด์„œ ํ•ด๊ฒฐํ–ˆ๋‹ค. ์‚ฌ์‹ค ๊ฐ€์žฅ ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ฝ”๋“œ๋Š”, ๋™์ž‘์˜ ์ง„ํ–‰์„ ํŒ๋‹จํ•˜๋Š” ํ•จ์ˆ˜์™€ ๋™์ž‘์ด ๋ถ„๊ธฐ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ–ˆ๋‹ค.

์ด ๊ฒฝ์šฐ, ์ž„๊ณ„ ์˜์—ญ์„ ์ตœ์†Œํ™”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ ๊ธฐ๋ฐ˜ ์ž ๊ธˆ๋ณด๋‹ค ์ข‹์€ ๋ฐฉ์‹์ด๋‹ค.

์ค‘๊ณ„๋œ ์„œ๋ฒ„(Adapted Server)

/* Code 2-4: Adapted Server */
 
public class ThreadSafeIntegerIterator {
    private IntegerIterator iterator = new IntegerIterator();
    
    public synchronized Integer getNextOrNull() { โœ…
        if(iterator.hasNext())
            return iterator.next();
        return null;
    }
}
 
// Shared Resource
IntegerIterator iterator = new IntegerIterator();
 
// Threaded-Code
while (true) {
    Integer nextValue = iterator.getNextOrNull();
    if (next == null)
        break;
    // do something with nextValue
}

์ด๋ฒˆ์—๋Š” iterator๋ฅผ ๋‚ด๋ถ€์— ๊ฐ€์ง์œผ๋กœ์„œ ์ž„๊ณ„์˜์—ญ์„ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค. ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ์‹์€ ์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ์ž ๊ธˆ๊ณผ ๋™์ผํ•˜๋‚˜, ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ๋ฐฉ์‹์ด๋‹ค.

๋™๊ธฐํ™”ํ•˜๋Š” ๋ถ€๋ถ„์„ ์ž‘๊ฒŒ ๋งŒ๋“ค์–ด๋ผ

Synchronized๋กœ ์ˆ˜ํ–‰๋˜๋Š” ์ž ๊ธˆ์€ ๋”œ๋ ˆ์ด์™€ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ์‚ฐ ๋น„์šฉ์ด ๋น„์‹ธ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ํ•œ ์ž‘๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

์ž‘๊ฒŒ ๋งŒ๋“ค๋ฉด์„œ๋„ critical section์€ ๊ผญ ๋ณดํ˜ธ๋˜์–ด์•ผ ํ•œ๋‹ค.

์ถ”์ฒœ: ๋™๊ธฐํ™”๋œ ์˜์—ญ์€ ์ตœ๋Œ€ํ•œ ์ž‘๊ฒŒ ๋งŒ๋“ค์–ด๋ผ.

์˜ฌ๋ฐ”๋ฅธ ์ข…๋ฃŒ ์ฝ”๋“œ๋Š” ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ต๋‹ค

๊ฐœ๋ฐœ ์ดˆ๊ธฐ์— ์‹œ์Šคํ…œ ์ข…๋ฃŒ์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋ผ. ์ด ์ž‘์—…์€ ์ƒ๊ฐ๋ณด๋‹ค ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ์ด๋‹ค. ๊ธฐ์กด์— ๊ตฌํ˜„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฆฌ๋ทฐํ•˜๋Š” ๊ฒƒ๋„ ํ•„์š”ํ•˜๋‹ค.

โ€ํ•ญ์ƒ ์‚ด์•„ ์žˆ์–ด์•ผ ํ•˜๋Š” ์ฝ”๋“œโ€์˜ ์ž‘์„ฑ์€ โ€œ์ž ์‹œ ๋™์ž‘ํ•˜๊ณ  ์กฐ์šฉํžˆ ๋๋‚˜๋Š”โ€ ์ฝ”๋“œ์˜ ์ž‘์„ฑ๊ณผ๋Š” ๋‹ค๋ฅด๋‹ค. ๊น”๋”ํ•˜๊ฒŒ ์ข…๋ฃŒํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค. ํ”ํžˆ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋กœ๋Š” Dead Lock์ด ์žˆ๋‹ค. ๋ถ€๋ชจ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž์‹ ์Šค๋ ˆ๋“œ๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ๋งŒ๋“  ํ›„ ๋ชจ๋‘๊ฐ€ ๋๋‚˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ ธ๋‹ค ์ž์›์„ ํ•ด์ œํ•˜๊ณ  ์ข…๋ฃŒํ•œ๋‹ค๊ณ  ํ•ด๋ณด์ž. ์ž์‹ ์Šค๋ ˆ๋“œ ๊ฐ„์— dead lock์ด ๊ฑธ๋ ธ๋‹ค๋ฉด ์–ด๋–จ๊นŒ? ํ˜น์€ ์ƒ์‚ฐ์ž/์†Œ๋น„์ž ๊ด€๊ณ„๋ผ๋ฉด? ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘, ๋ฌดํ•œ์ • ๋Œ€๊ธฐํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ์ข…๋ฃŒ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ์ฝ”๋“œ๋ฅผ ์งœ๋Š” ๊ฒฝ์šฐ, ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์„ ํˆฌ์žํ•ด์•ผ ํ•œ๋‹ค.

์Šค๋ ˆ๋“œ ์ฝ”๋“œ ํ…Œ์ŠคํŠธํ•˜๊ธฐ

๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•œ๋‹ค๋ฉด, ํ”„๋กœ๊ทธ๋žจ ์„ค์ •๊ณผ ์‹œ์Šคํ…œ ์„ค์ •์„ ๋ฐ”๊ฟ”๊ฐ€๋ฉฐ ์ž์ฃผ ๋Œ๋ฆฌ์ž. ๊ฐ„ํ—์ ์œผ๋กœ ํ†ต๊ณผํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€์„œ ๋ ์ผ์ด ์•„๋‹ˆ๋‹ค.

๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์ด๋ผ๋ฉด, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ถฉ๋ถ„ํžˆ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค. ์ •ํ™•์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์ด๋ผ๋ฉด, ๊ณ ๋ คํ•  ์ƒํ™ฉ์ด ๋งค์šฐ ๋งŽ์•„์ง„๋‹ค.

๋ง์ด ์•ˆ ๋˜๋Š” ์‹คํŒจ๋Š” ์ž ์ •์ ์ธ ์Šค๋ ˆ๋“œ ๋ฌธ์ œ๋กœ ์ทจ๊ธ‰ํ•˜๋ผ

์‹œ์Šคํ…œ ์‹คํŒจ๋ฅผ ์ผํšŒ์„ฑ์ด๋ผ ์น˜๋ถ€ํ•˜์ง€ ๋งˆ๋ผ.

๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ์ฝ”๋“œ๋ฅผ ์งœ๋‹ค๋ณด๋ฉด โ€œ๋ง์ด ์•ˆ๋˜๋Š”โ€ ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚จ๋‹ค. ์‹ค์ œ๋กœ ๋‚ด ์ƒ์‹์œผ๋กœ๋Š” ๋Œ์•„๊ฐ€์•ผ ํ•˜๋Š”๋ฐ, ๊ทธ๋ ‡์ง€ ์•Š์€ ์ƒํ™ฉ์„ ๋งˆ์ฃผํ•œ๋‹ค. ์ด๋Š” ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์ด ์ฃผ๋Š” ๋ณต์žกํ•จ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ๋‹ค. ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ ๊ฐœ๋ฐœ์ž๋“ค์€, ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ์šฐ์ฃผ์„  ๋ฌธ์ œ(?), ํ•˜๋“œ์›จ์–ด ๋ฌธ์ œ ๋“ฑ ์ผํšŒ์„ฑ ๋ฌธ์ œ๋กœ ์น˜๋ถ€ํ•˜๊ณ  ๋ฌด์‹œํ•˜๊ธฐ ๋งˆ๋ จ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์ผํšŒ์„ฑ ๋ฌธ์ œ๋กœ ์น˜์›Œ๋‘” ๋ฌธ์ œ๋ฅผ ๊ณ„์† ๋ฌด์‹œํ•œ๋‹ค๋ฉด ์ž˜๋ชป๋œ ์ฝ”๋“œ ์œ„์— ์ฝ”๋“œ๊ฐ€ ๊ณ„์† ์Œ“์ธ๋‹ค.

๋‹ค์ค‘ ์Šค๋ ˆ๋“œ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ์ˆœ์ฐจ ์ฝ”๋“œ๋ถ€ํ„ฐ ์ œ๋Œ€๋กœ ๋Œ๊ฒŒ ๋งŒ๋“ค์ž

์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ ๋ฐ–์—์„œ ์ƒ๊ธฐ๋Š” ๋ฒ„๊ทธ์™€ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์ƒ๊ธฐ๋Š” ๋ฒ„๊ทธ๋ฅผ ๋™์‹œ์— ๋””๋ฒ„๊น…ํ•˜์ง€ ๋งˆ๋ผ. ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ ๋ฐ–์—์„œ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ํ™•์ธํ•˜๊ณ  ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์„ ์ฒดํฌํ•˜์ž.

์Šค๋ ˆ๋“œ ๋‚ด๋ถ€์—์„œ ํŠน์ • ์ฝ”๋“œ๊ฐ€ ๋Œ์•„๊ฐ€๊ณ  ์žˆ๋‹ค๋ฉด, ๋‚ด๋ถ€์—์„œ ๋Œ์•„๊ฐ€๋Š” ์ฝ”๋“œ์˜ ํ…Œ์ŠคํŠธ๋ถ€ํ„ฐ ์ˆ˜ํ–‰ํ•˜์ž. ๋‚ด๋ถ€์— ๋“ค์–ด๊ฐ€๋Š” ์ฝ”๋“œ๋Š” ์Šค๋ ˆ๋“œ์™€ ๊ด€๋ จ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์ •ํ™•์„ฑ ์ฒดํฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋‹ค์ค‘ ์Šค๋ ˆ๋“œ๋ฅผ ์“ฐ๋Š” ์ฝ”๋“œ ๋ถ€๋ถ„์„ ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์— ์‰ฝ๊ฒŒ ๋ผ์›Œ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ฒŒ ์Šค๋ ˆ๋“œ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ผ

๋‹ค์–‘ํ•œ ์„ค์ •์—์„œ ์‹คํ–‰ํ•  ๋ชฉ์ ์œผ๋กœ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์— ์‰ฝ๊ฒŒ ๋ผ์›Œ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ฒŒ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์ž.

  • ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ, ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ, ์‹คํ–‰ ์ค‘ ์Šค๋ ˆ๋“œ ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ํ…Œ์ŠคํŠธ ํ•œ๋‹ค.
  • ์Šค๋ ˆ๋“œ ์ฝ”๋“œ๋ฅผ ์‹ค์ œ ํ™˜๊ฒฝ, ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ๋Œ๋ ค๋ณธ๋‹ค.
  • ์—ฌ๋Ÿฌ ์†๋„(๋น ๋ฅด๊ฒŒ, ์ฒœ์ฒœํžˆ)๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋Œ๋ ค๋ณธ๋‹ค.
  • ๋ฐ˜๋ณต ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

๋‹ค์ค‘ ์Šค๋ ˆ๋“œ๋ฅผ ์“ฐ๋Š” ์ฝ”๋“œ ๋ถ€๋ถ„์„ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์กฐ์œจํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ž‘์„ฑํ•˜๋ผ

์ ์ ˆํ•œ ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜๋ฅผ ํŒŒ์•…ํ•˜๋ ค๋ฉด ์ƒ๋‹นํ•œ ์‹œํ–‰์ฐฉ์˜ค๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—, ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์–‘ํ•œ ์„ค์ •์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ ์ธก์ • ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•˜์ž. ์ฆ‰, ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜๋ฅผ ์กฐ์œจํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์ž. ํ”„๋กœ๊ทธ๋žจ์ด ๋™์ž‘ํ•˜๋Š” ์‹œ์ ์— ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๊ณ ๋ คํ•˜์ž. ํ˜น์€ ์ฒ˜๋ฆฌ์œจ๊ณผ ํšจ์œจ์— ๋”ฐ๋ผ ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜๋ฅผ ์กฐ์œจํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.

ํ”„๋กœ์„ธ์„œ ์ˆ˜๋ณด๋‹ค ๋งŽ์€ ์Šค๋ ˆ๋“œ๋ฅผ ๋Œ๋ ค๋ณด๋ผ

์‹œ์Šคํ…œ์—์„œ ์šด์˜ํ•˜๋Š” ๋ฌผ๋ฆฌ ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜์™€ ์†Œํ”„ํŠธ์›จ์–ด ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜๊ฐ€ ๋‹ค๋ฅด๋ฉด ์Šค์™€ํ•‘์ด ์ผ์–ด๋‚œ๋‹ค. ์Šค์™€ํ•‘์ด ์žฆ์œผ๋ฉด ์ž„๊ณ„์˜์—ญ์„ ๋นผ๋จน์€ ์ฝ”๋“œ, Dead Lock์„ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค. ์ž„์˜๋กœ ์†Œํ”„ํŠธ์›จ์–ด ์Šค๋ ˆ๋“œ๋ฅผ ๋งŽ์ด ๋งŒ๋“ค์–ด ์Šค์™€ํ•‘์„ ์ผ์œผ์ผœ ๋ฌธ์ œ๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

๋‹ค๋ฅธ ํ”Œ๋žซํผ์—์„œ ๋Œ๋ ค๋ณด๋ผ

์ฒ˜์Œ๋ถ€ํ„ฐ, ๊ทธ๋ฆฌ๊ณ  ์ž์ฃผ ๋ชจ๋“  Target Platform์—์„œ ์ฝ”๋“œ๋ฅผ ๋Œ๋ ค๋ณด์ž.

์ €์ž๋Š” ์œˆ๋„์šฐ XP, OS X์—์„œ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋Œ๋ฆด ์ผ์ด ์ƒ๊ฒผ๋Š”๋ฐ, ์–ด๋””๋Š” ๋˜๊ณ  ์–ด๋””๋Š” ์•ˆ๋๋‹ค. ๊ทธ ์ด์œ ๋Š” ๊ฐ๊ฐ์˜ ์šด์˜์ฒด์ œ ๋งˆ๋‹ค ์Šค๋ ˆ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ •์ฑ…์ด ๋‹ฌ๋ž๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ๊นŒ์ง€ ๋ด‰์‡„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์—ฌ๋Ÿฌ ํ”Œ๋žซํผ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์ฝ”๋“œ์— ๋ณด์กฐ ์ฝ”๋“œ instrument๋ฅผ ๋„ฃ์–ด ๋Œ๋ ค๋ผ. ๊ฐ•์ œ๋กœ ์‹คํŒจ๋ฅผ ์ผ์œผํ‚ค๊ฒŒ ํ•ด๋ณด๋ผ

์Šค๋ ˆ๋“œ ๋ฒ„๊ทธ๊ฐ€ ์‚ฐ๋ฐœ์ ์ด๊ณ , ์šฐ๋ฐœ์ ์ด๋ฉฐ, ์žฌํ˜„์ด ์–ด๋ ค์šด ์ด์œ ๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ˆ˜์ฒœ๊ฐ€์ง€ ๊ฒฝ๋กœ์ค‘์— ์•„์ฃผ ์†Œ์ˆ˜๋งŒ ์‹คํŒจํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด๋ ‡๊ฒŒ ๋นˆ๋„ ํšŸ์ˆ˜๊ฐ€ ๊ทน๋„๋กœ ์ ์€ ๊ฒฝ์šฐ์— ์—๋Ÿฌ๋ฅผ ์žก๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ? ์ด๊ฑด ๋น„๋‹จ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ํ•ด๊ฒฐ์ฑ…์€ ์•„๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋จผ์ € ํ•ด๋ณผ ๋ฐฉ๋ฒ•์€ ๋นˆ๋„์ˆ˜๋ฅผ ๊ทน๋„๋กœ ์˜ฌ๋ ค ๋ฐœ์ƒ ํšŸ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค. ํ™•๋ฅ ์ ์œผ๋กœ ๋ฐœ์ƒ ์ˆ˜๋Š” ๊ฐ™์œผ๋‚˜, ํšŸ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋Œ€์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ์„ ๋” ์ž์ฃผ ๋งˆ์ฃผํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ๋Š” ๋ณด์กฐ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. wait(), sleep(), yield(), priority() ๋“ฑ๊ณผ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์ˆœ์„œ๋กœ ์‹คํ–‰๋˜๋„๋ก ํ•ด๋ณด์ž.

์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ธฐ

์ด๋Š” wait(), sleep(), yield(), priority() ๋“ฑ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์‹คํ–‰ ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•จ์œผ๋กœ์จ ์ฝ”๋“œ์˜ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

/* Code 3-1 */
 
public synchronized String nextUrlOrNull() {
    if(hasNext()) {
        String url = urlGenerator.next();
        Thread.yield(); โœ…
        // inserted for testing.
        updateHasNext();
        return url;
    }
    return null;
}

yield() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•จ์œผ๋กœ์จ ์ฝ”๋“œ์˜ ์‹คํ–‰ ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ์œ„ ์ฝ”๋“œ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ์ด๋Š” yield()๋ฅผ ์ถ”๊ฐ€ํ•ด ์ƒ๊ธด ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ด๋ฏธ ์กด์žฌํ•˜๋˜ ๋ฌธ์ œ๋ฅผ ๋ช…๋ฐฑํžˆ ๋งŒ๋“ ๊ฒƒ ๋ฟ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์—๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

  • ํ…Œ์ŠคํŠธํ•  ๋ถ€๋ถ„์„ ์ง์ ‘ ์ฐพ์•„์•ผ ํ•œ๋‹ค.
  • ์–ด๋””์— ์–ด๋Š ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ• ์ง€ ์•Œ๊ธฐ ์–ด๋ ต๋‹ค.
  • ์ด์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ œํ’ˆ์— ํฌํ•จํ•ด ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํผํฌ๋จผ์Šค๋ฅผ ์ €ํ•˜์‹œํ‚ฌ ๋ฟ์ด๋‹ค.
  • ๋ฌด์ž‘์œ„์ ์ด๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ๋“œ๋Ÿฌ๋‚  ์ˆ˜๋„ ์žˆ๊ณ , ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค. ์•„๋‹ ํ™•๋ฅ ์ด ๋” ๋†’๋‹ค.

์ด๋Ÿฐ ๊ฒฝ์šฐ, debug ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด debug์‹œ์—๋งŒ ์ปดํŒŒ์ผ ๋˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค. ๊ทผ๋ณธ์ ์œผ๋กœ๋Š” POJO ๋‹จ์œ„๋กœ ๋‚˜๋ˆ ์„œ, instrument code๋ฅผ ์‚ฝ์ž…ํ•  ๋ถ€๋ถ„์„ ์ฐพ๊ธฐ ์‰ฝ๊ธฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๊ฒ ๋‹ค.

์ž๋™ํ™”

์œ„์™€ ๋‹ค๋ฅด๊ฒŒ Aspect-oriented Framework, CGLib, ASM๋“ฑ์„ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

/* Code 4-1 */
 
public class ThreadJigglePoint {
    public static void jiggle() { }
}
 
public synchronized String nextUrlOrNull() {
    if(hasNext()) {
        ThreadJiglePoint.jiggle(); โœ…
        String url = urlGenerator.next();
        ThreadJiglePoint.jiggle(); โœ…
        updateHasNext();
        ThreadJiglePoint.jiggle(); โœ…
        return url;
    }
    return null;
}

jiggle์€ ์˜์–ด๋กœ ํ”๋“ค๋‹ค๋ผ๋Š” ๋œป์ด๋‹ค. ์ฆ‰, ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋‘๊ณ , ๋””๋ฒ„๊ทธ ํ™˜๊ฒฝ์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ thread๋ฅผ sleep() ํ•˜๊ฑฐ๋‚˜, yield() ํ•˜๋Š” ๋™์ž‘์„ ๋„ฃ์–ด๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค. ํ˜น์€ ๋ฌด์ž‘์œ„๋กœ ๋‘˜ ์ค‘ ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค. ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ๋Š” ๊ตฌํ˜„์„ ๋นผ๋ฒ„๋ฆฐ๋‹ค.

๊ฒฐ๋ก 

  • ๋™์‹œ์„ฑ ์ฝ”๋“œ๋Š” ์ œ๋Œ€๋กœ ์ž‘์„ฑํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
  • SRP๋ฅผ ์ค€์ˆ˜ํ•ด์•ผ ํ•œ๋‹ค. ์Šค๋ ˆ๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ฝ”๋“œ์™€ ๊ทธ์™€ ๋ฌด๊ด€ํ•œ ์ฝ”๋“œ๋Š” ๊ตฌ๋ถ„ํ•ด์•ผ ํ•œ๋‹ค.
  • ํ…Œ์ŠคํŠธ์‹œ์—๋Š” ์Šค๋ ˆ๋“œ ๋ฌด๊ด€ํ•œ ์ฝ”๋“œ๋ถ€ํ„ฐ ๋™์ž‘์˜ ์ •ํ™•์„ฑ์„ ๊ฒ€์ฆํ•œ๋‹ค.
  • ๋™์‹œ์„ฑ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ž ์ •์ ์ธ ์›์ธ์— ๋Œ€ํ•ด ๋จผ์ € ์ˆ™์ง€ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•œ ๊ธฐ๋ณธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ดํ•ดํ•œ๋‹ค.
  • ์ž„๊ณ„ ์˜์—ญ์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  ํŠน์ • ์ฝ”๋“œ์˜ ์ง„์ž…์„ ์ž ๊ทธ๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•œ๋‹ค.
  • ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด ์ž„๊ณ„ ์˜์—ญ์€ ์ตœ๋Œ€ํ•œ ์ค„์ธ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๊ณต์œ  ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ฑ…์ž„์„ ๋– ๋„˜๊ธฐ์ง€ ์•Š๋Š”๋‹ค.
  • ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ํ…Œ์ŠคํŠธ ์‹คํŒจ๋ฅผ ์ผํšŒ์„ฑ์œผ๋กœ ๋„˜๊ธฐ์ง€ ๋ง์•„๋ผ.
  • ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ, ์Šค๋ ˆ๋“œ ์ˆ˜, ์‹คํ–‰ ์†๋„, ๋ณด์กฐ ์ฝ”๋“œ, ๋นˆ๋„์ˆ˜ ์ฆ๋Œ€ ๋“ฑ์˜ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์‰ฝ์‚ฌ๋ฆฌ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๋™์‹œ์„ฑ ๋ฌธ์ œ์˜ ๋นˆ๋„์ˆ˜๋ฅผ ๋†’ํ˜€ ๋ฌธ์ œ๋ฅผ ์ฐพ์•„๋ผ.

Reference