๐Ÿฏ[TIL] 250620-015

byoยท2025๋…„ 6์›” 20์ผ

๐Ÿ’ซ JAVA

โœ”๏ธ Thread

  • ์„ธํƒ๊ธฐ - ์„ธํƒ๋ฌผ ๋„ฃ๊ธฐ - ์ „์›๋ฒ„ํŠผ (์„ธํƒ๊ธฐ ๋™์ž‘)
  • ๋กœ๋ด‡์ฒญ์†Œ๊ธฐ - ์ „์›๋ฒ„ํŠผ (๋กœ๋ด‡์ฒญ์†Œ๊ธฐ ๋™์ž‘)
  • ํ™”์žฅ์‹ค ์ฒญ์†Œํ•˜๊ธฐ - ์Šค์Šค๋กœ
    -> ํ•œ ๋ฒˆ์— ์„ธ ๊ฐœ์˜ ์ฒญ์†Œ๋ฅผ ๋ณ‘๋ ฌ์ ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ… Thread๋ž€?

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

โœ… Thread ์ƒ์„ฑ ๋ฐฉ๋ฒ•

  • ์ž๋ฐ”์—์„œ๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค ๋•Œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค:
    1) Thread ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๊ฑฐ๋‚˜
    2) Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ
  • ์ด๋ฒˆ ์˜ˆ์ œ์—์„œ๋Š” Thread ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
class MyThread extends Thread {
    public void run() {
        // ์‹คํ–‰ํ•  ์ž‘์—… ์ž‘์„ฑ
    }
}

โœ… run() ๋ฉ”์„œ๋“œ

  • ์Šค๋ ˆ๋“œ๊ฐ€ ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ํ•  ์ž‘์—… ๋‚ด์šฉ์„ ๋‹ด๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.
  • run()์„ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋ฉด ๋‹จ์ˆœํ•œ ๋ฉ”์„œ๋“œ ์‹คํ–‰์ด ๋˜๊ณ ,
    ๋ฐ˜๋“œ์‹œ start()๋กœ ํ˜ธ์ถœํ•ด์•ผ ์ง„์งœ ์Šค๋ ˆ๋“œ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • Thread class ์˜ run() ๋ฉ”์†Œ๋“œ๋ฅผ Override ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.
@Override
public void run() {
    for (int i = 1; i <= 5; i++) {
        System.out.println("MyThread: " + i);
    }
}

โœ… sleep()์œผ๋กœ ์ผ์‹œ ์ •์ง€

  • Thread.sleep(๋ฐ€๋ฆฌ์ดˆ)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์Šค๋ ˆ๋“œ๋ฅผ ์ž ๊น ๋ฉˆ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ: 500์€ 0.5์ดˆ ๋™์•ˆ ์ผ์‹œ ์ •์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๋ฉ”์„œ๋“œ๋Š” ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ try-catch๋กœ ๊ฐ์‹ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
try {
    Thread.sleep(500);
} catch (InterruptedException e) {
    System.out.println("Thread interrupted");
}

โœ… Thread ์‹คํ–‰

  • Thread ๊ฐ์ฒด๋ฅผ ๋งŒ๋“  ํ›„ start()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ์—์„œ run()์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • run()์„ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์ด ๋˜์ง€ ์•Š๊ณ  ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ์ฒ˜๋Ÿผ ์ˆœ์ฐจ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
class MyThread extends Thread {
    @Override
    public void run() {
        for(int i = 1; i <= 5; i++) {
            System.out.println("My Thread: " + i);
            
            try {
                Thread.sleep(5000);
            } catch(InterruptedException e) {
                System.out.println("MyThread was interrupted.");
            }
        }
    }
}
public class Main {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
    }
}

๐Ÿค” ๋งŒ์•ฝ run()๊ณผ start()๋ฅผ ๋™์‹œ์— ํ˜ธ์ถœํ•œ๋‹ค๋ฉด?

public class Main {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
        thread.run();
    }
}
  • start๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜๊ณ  run์€ ๋ฉ”์ธ์ŠคํŠธ๋ฆผ์—์„œ ์‹คํ–‰๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‚ญ๋น„ํ•˜๋Š” ํ˜„์ƒ.

โ†”๏ธ start() vs run() ์ฐจ์ด์ 

๊ตฌ๋ถ„start()run()
์‹คํ–‰ ๋ฐฉ์‹์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋‚ด๋ถ€์ ์œผ๋กœ run() ์‹คํ–‰๋‹จ์ˆœํ•œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ (์Šค๋ ˆ๋“œ ์•„๋‹˜)
๋ณ‘๋ ฌ ์ฒ˜๋ฆฌO (์‹ค์ œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๋™์ž‘)X (ํ˜„์žฌ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋จ)
์‚ฌ์šฉ ๋ชฉ์ ์Šค๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ์‚ฌ์šฉ์‹คํ–‰ํ•  ์ž‘์—… ๋‚ด์šฉ์„ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉ
์‹คํ–‰ ๊ฒฐ๊ณผ์ƒˆ๋กœ์šด ์‹คํ–‰ ํ๋ฆ„์ด ์ƒ๊ฒจ run()์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋จ๊ทธ๋ƒฅ ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ์ฒ˜๋Ÿผ ์‹คํ–‰๋จ

๐Ÿ” Thread ์ฃผ์š” ๋ฉ”์„œ๋“œ ์š”์•ฝ

๋ฉ”์„œ๋“œ์„ค๋ช…
run()์Šค๋ ˆ๋“œ์—์„œ ์‹ค์ œ๋กœ ์‹คํ–‰ํ•  ์ž‘์—…์„ ์ •์˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ
start()์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋‚ด๋ถ€์ ์œผ๋กœ run() ์‹คํ–‰
sleep(ms)์ง€์ •๋œ ์‹œ๊ฐ„(ms) ๋™์•ˆ ์Šค๋ ˆ๋“œ๋ฅผ ์ผ์‹œ ์ •์ง€์‹œํ‚ด
interrupt()๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์— ์ค‘๋‹จ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉฐ, sleep() ์ค‘์ด๋ฉด InterruptedException ๋ฐœ์ƒ

โœ”๏ธ Runnable

โœ… Runnable์ด๋ž€?

  • Runnable์€ ์ž๋ฐ”์—์„œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.
  • Thread ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋™์‹œ์— ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋” ์œ ์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… Runnable ํด๋ž˜์Šค ์ƒ์„ฑ
Runnable์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์—์„œ๋Š” ๋ฐ˜๋“œ์‹œ run() ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋ฉฐ,
์ด ๋ฉ”์„œ๋“œ ์•ˆ์— ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰ํ•  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("Runnable ์‹คํ–‰ ์ค‘");
    }
}

โœ… Runnable ์‹คํ–‰ ๋ฐฉ๋ฒ•
Runnable์€ ์‹คํ–‰ํ•  ์ฝ”๋“œ๋งŒ ์ •์˜ํ•˜๋ฉฐ, ์ง์ ‘ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
Thread ๊ฐ์ฒด์— ์ „๋‹ฌํ•œ ํ›„ start()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.


public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread(new MyRunnable());
        thread.start();
    }
}

โœ… Thread.sleep()๊ณผ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

  • ์Šค๋ ˆ๋“œ ์‹คํ–‰ ์ค‘ ์ž ์‹œ ์‰ฌ๊ฒŒ ํ•˜๋ ค๋ฉด Thread.sleep()์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๋ฉ”์„œ๋“œ๋Š” InterruptedException์„ ๋˜์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ try-catch๋กœ ๊ฐ์‹ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
try {
    Thread.sleep(500);
} catch (InterruptedException e) {
    System.out.println("์Šค๋ ˆ๋“œ๊ฐ€ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
}

โœ… Thread ์ด๋ฆ„

  • thread.setName(), thread.getName() ๋งค์„œ๋“œ๋กœ ์ด๋ฆ„์„ ์ง€์ •, ์ด๋ฆ„์„ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
  • runnable ์ธ์Šคํ„ด์Šค๋ฅผ Thread ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ ๊ฒฝ์šฐ ๋‘๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("Runnable executed");
        for(int i = 1; i <= 5; i++) {
            try {
                Thread.sleep(5000);
                System.out.println(i);
            } catch (InterruptedException e) {
                System.out.println(e.getMessage());
            }
        }
    }
}

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println(getName() + " Thread executed");
    }
}

public class Main {
    public static void main(String[] args) {
        Thread firstThread = new Thread(new MyRunnable(), "First Thread");
        firstThread.start();
        Thread secondThread = new MyThread();
        secondThread.setName("second");
        secondThread.start();
    }
}

โœ… ๋žŒ๋‹ค์‹์œผ๋กœ runnable ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ธฐ

public class Main {
    public static void main(String[] args) {
        new Thread(()-> {
            System.out.println("Runnable ์‹คํ–‰ ์ค‘");

            for(int i = 1; i <= 5; i++) {
                try {
                    Thread.sleep(5000);
                    System.out.println(i);
                } catch(InterruptedException e) {
                    System.out.println(e.getMessage());
                }
            }
        }).start();
    }
}

โœ๏ธ ์˜ˆ์ œ: Hello ์ถœ๋ ฅ
Runnable์„ ์‚ฌ์šฉํ•ด 0.5์ดˆ๋งˆ๋‹ค 'Hello'๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.
run() ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ๋ฐ˜๋ณต๋ฌธ๊ณผ sleep()์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

class MyRunnable implements Runnable {
    @Override
    public void run() {
        for (int i = 1; i <= 5; i++) {
            System.out.println("Hello from Thread: " + i);
            try { Thread.sleep(500); } catch (InterruptedException e) {
                System.out.println("Thread was interrupted.");
            }
        }
    }
}

โœ๏ธ ์˜ˆ์ œ: ๋ฐฐ์—ด ํ•ฉ๊ณ„ ๊ณ„์‚ฐ
๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋ฐฐ์—ด์„ ๊ฐ๊ฐ์˜ ์Šค๋ ˆ๋“œ์—์„œ ๋™์‹œ์— ํ•ฉ์‚ฐํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.
Runnable์„ ๊ตฌํ˜„ํ•ด run() ์•ˆ์—์„œ ๋ฐฐ์—ด์˜ ํ•ฉ์„ ๊ณ„์‚ฐํ•˜๊ณ  ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

class SumRunnable implements Runnable {
    private final int[] numbers;

    SumRunnable(int[] numbers) {
        this.numbers = numbers;
    }

    @Override
    public void run() {
        int sum = 0;
        System.out.println("SumRunnable executed");
        for (int i = 0; i < numbers.length; i++) {
            sum += numbers[i];
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                System.out.println("SumRunnable interrupted");
            }
        }
        System.out.println(Thread.currentThread().getName() + ": SumRunnable returned " + sum);
    }
}
public class Main {
    public static void main(String[] args) {
        int[][] dataSets = {
                {1, 2, 3, 4, 5},
                {10, 20, 30, 40, 50},
                {7, 14, 21, 28},
                {100, 200, 300, 400}
        };
        for (int[] dataSet : dataSets) {
            Thread sumThread = new Thread(new SumRunnable(dataSet));
            sumThread.start();
        }
    }
}

โœ”๏ธ Synchronization | ๋™๊ธฐํ™”

โœ… ๋™๊ธฐํ™”(synchronization)๋ž€?

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

โœ… ์Šค๋ ˆ๋“œ ์ƒ์„ฑ ๋ฐ ์‹คํ–‰

  • 5๊ฐœ์˜ Thread๋ฅผ ์ƒ์„ฑํ•ด Runnable ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ณ ,
    ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ์ตœ์ข… count ๊ฐ’์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
class Counter {
    private int count = 0;

    public void increment() {
        count++;
    }

    public int getCount() {
        return count;
    }
}

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Counter counter = new Counter();
        Runnable task = () -> {
            for(int i = 0; i < 10000; i++) {
                counter.increment();
            }
        };
        Thread[] threads = new Thread[5];
        for (int i = 0; i < threads.length; i++) {
            threads[i] = new Thread(task);
            threads[i].start();
        }
        for(Thread t: threads) {
            t.join(); // ๊ฐ ์Šค๋ ˆ๋“œ๋ฅผ ๊ธฐ๋‹ค๋ ค์ค€๋‹ค.
        }
        System.out.println("Final count: " + counter.getCount());
    }
}

โ–ถ๏ธ
Final count: 47989

โœ… ์‹คํ–‰ ๊ฒฐ๊ณผ ์˜ˆ์ธก

  • ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ํ•ญ์ƒ 5000์ด ๋‚˜์˜ค์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ: 4266, 4782 ๋“ฑ ๋งค๋ฒˆ ๋‹ค๋ฅด๊ฒŒ ์ถœ๋ ฅ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— count++๋ฅผ ์‹คํ–‰ํ•˜๋ฉด์„œ ์ค‘๊ฐ„ ๊ฐ’์ด ๋ฎ์–ด์”Œ์›Œ์ง€๊ฑฐ๋‚˜ ์œ ์‹ค๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

โ„น๏ธ Race Condition
๊ฒฝ์Ÿ ์กฐ๊ฑด


โœ… synchronized๋กœ ํ•ด๊ฒฐ

  • increment() ๋ฉ”์„œ๋“œ์— synchronized ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ด๋ฉด,
    ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด ๊ฐ’์ด ์—‰ํ‚ค๋Š” ๋ฌธ์ œ๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
public synchronized void increment() {
    count++;
}

โœ… ๋™๊ธฐํ™” ์ ์šฉ ํ›„ ๊ฒฐ๊ณผ

  • synchronized๋ฅผ ์ ์šฉํ•œ ํ›„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด
  • ํ•ญ์ƒ ์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ€ 5000์œผ๋กœ ์ •ํ™•ํ•˜๊ฒŒ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฒˆ๊ฐˆ์•„ ์•ˆ์ „ํ•˜๊ฒŒ ์ž‘์—…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์ด ๊ผฌ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
Final count: 50000

โ†”๏ธ synchronized ์‚ฌ์šฉ ์ „/ํ›„ ๋น„๊ต

์กฐ๊ฑด๋™๊ธฐํ™” ์ „๋™๊ธฐํ™” ํ›„
count ์ตœ์ข…๊ฐ’์‹คํ–‰๋งˆ๋‹ค ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Œ (์˜ˆ: 4266)ํ•ญ์ƒ 5000์œผ๋กœ ์ •ํ™•ํ•จ
์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ๋†’์Œ (์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผ)์—†์Œ (์ˆœ์ฐจ์ ์œผ๋กœ ์ ‘๊ทผ)
์ฝ”๋“œ ์•ˆ์ •์„ฑ๋‚ฎ์Œ (์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ ๋ฐœ์ƒ)๋†’์Œ (์ผ๊ด€๋œ ๊ฒฐ๊ณผ ๋ณด์žฅ)

โœ”๏ธ Prallel Paradigm

โœ… ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ž€?

  • ํ•˜๋‚˜์˜ ํฐ ์ž‘์—…์„ ์—ฌ๋Ÿฌ ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. *Thread์˜ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์—…์„ ๋™์‹œ์— ์ฒ˜๋ฆฌ
  • ์—ฌ๋Ÿฌ CPU ์ฝ”์–ด๋ฅผ ํ™œ์šฉํ•ด ์ž‘์—… ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
profile
๐Ÿ—‚๏ธ hamstern

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