[Java] ์Šค๋ ˆ๋”ฉ

์ž๋ฐ”์—์„œ ์Šค๋ ˆ๋”ฉ์„ ๋‹ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค๋Š” Thread๋‹ค.
์•„๋ž˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

import java.util.*;

public class Main
{
    public static void main(String[] args) throws Exception
    {
        System.out.println("## ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์‹œ์ž‘");

        var threads = new ArrayList<Thread>();
        threads.add(new Thread( ()->System.out.println("์ฒซ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ์š”") ));
        threads.add(new Thread( ()->System.out.println("๋‘๋ฒˆ์งธ ์Šค๋ ˆ๋“œ์š”") ));
        threads.add(new Thread( ()->System.out.println("์„ธ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ์š”") ));
        threads.add(new Thread( ()->System.out.println("๋„ค๋ฒˆ์งธ ์Šค๋ ˆ๋“œ์š”") ));

        //์ „๋ถ€ ์‹œ์ž‘
        for(var thread : threads)
            thread.start();

        System.out.println("## ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์ข…๋ฃŒ");
    }
}

์ž˜ ๋Œ์•„๊ฐ€๊ธด ํ•˜๋Š”๋ฐ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋๋‚˜๊ธฐ๋„ ์ „์— ๋๋‚˜๋ฒ„๋ ธ๋‹ค.
์—ฌ๊ธฐ์„œ๋Š” ๋ณ„ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์ง€๋งŒ, ๋Œ€๊ธฐ๋ฅผ ๊ฑธ ํ•„์š”๊ฐ€ ์žˆ๋‹ค๋ฉด Join์„ ๊ฑธ์–ด๋ฒ„๋ฆฌ๋ฉด ๋œ๋‹ค.
๊ทธ๋Ÿผ ์ € ์Šค๋ ˆ๋“œ๋“ค์ด ๋‹ค ๋๋‚ ๋•Œ๊นŒ์ง€ ๋ฉ”์ธ์Šค๋ ˆ๋“œ๊ฐ€ ๋ธ”๋Ÿญ๋œ๋‹ค.


์ด๋ ‡๊ฒŒ.

๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ ๋ ˆ์ด์Šค์— ๋Œ€ํ•ด ๋ด๋ณด์ž.
์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ํ•˜๋‚˜์˜ ๊ณต์œ  ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๋‹ค๋ณด๋ฉด ์ถฉ๋Œ๋กœ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
์•„๋ž˜์™€ ๊ฐ™์ด

์ด๊ฑธ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋™๊ธฐํ™”๋ฅผ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
synchronized ํ‚ค์›Œ๋“œ๋Š” ๋ฉ”์„œ๋“œ๋‚˜ ์ž„์˜์˜ ๋กœ์ปฌ์— ๋ถ™์ผ ์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ, ๊ทธ๋Ÿฌ๋ฉด ์ž ๊ธˆ์šฉ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ๋‹ค๊ฐ€ ๊ทธ๊ฑธ๋กœ ์ž ๊ธˆ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค€๋‹ค. ์ž ๊ธˆ์šฉ ๊ฐ์ฒด๋Š” Object๋ฉด ์•„๋ฌด๊ฑฐ๋‚˜ ๋‹ค ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ.

์ž„์˜์˜ ์ž ๊ธˆ ํด๋ž˜์Šค๋“ค์„ ์จ๋„ ๋œ๋‹ค.
๋™๊ธฐํ™” ๊ธฐ์ˆ  ์ค‘ ํ•˜๋‚˜์ธ ์ƒํ˜ธ ๋ฐฐ์ œ(Mutex)๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋“ค์ด ๋ช‡๊ฐœ ์žˆ๋Š”๋ฐ, ์ „๋ถ€ Lock ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•œ ํด๋ž˜์Šค๋“ค์ด๋‹ค. ์ด๋ฆ„ ๋’ค์—๋„ Lock์ด ๋ถ™๋Š”๋‹ค.

์ด๊ฒƒ๋„ ์ž˜ ๋œ๋‹ค.

์ทจํ–ฅ๋Œ€๋กœ ๊ณจ๋ผ์“ฐ๋ฉด ๋˜๋Š”๋ฐ, ๋ณดํ†ต์€ synchronized ๋ธ”๋Ÿญ์„ ์“ฐ๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋Š”๋“ฏํ•˜๋‹ค.