์ผ๋‹จ ํ•˜๊ณ  ๋ณด๋Š” ์‚ฌ๋žŒ

๋‚˜์ค‘๋ณด๋‹จ ์ง€๊ธˆ์— ์ง‘์ค‘ํ•˜๋˜, ์ง€๊ธˆ๋ณด๋‹จ ๋‚˜์ค‘์— ์™„๋ฒฝํ•ด์ง€์ž๐Ÿ’ช๐Ÿป

๐Ÿ—ž๏ธ IT ๋™ํ–ฅ ํŒŒ์•… ๋ฐ ๋‚˜์˜ ์ƒ๊ฐ ์ •๋ฆฌ

Java ๋™์‹œ์„ฑ: ๊ฐ€์‹œ์„ฑ ๋ฐ ๋™๊ธฐํ™”

JanginTech 2024. 8. 29. 14:48

1. Java Concurrency: Visibility and Synchronized

https://dzone.com/articles/java-concurrency-visibility-and-synchronized

 

 

[ ์š”์•ฝ ]

๋‘ ์Šค๋ ˆ๋“œ ๊ฐ„์˜ ๋ณ€์ˆ˜ ๊ฐ€์‹œ์„ฑ๊ณผ, ๊ณต์œ  ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ผ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

 

์ง€์–‘ํ•ด์•ผ ํ•  ์ฝ”๋“œ

import java.util.Date;
 
public class UnSynchronizedCountDown {
    private int number = Integer.MAX_VALUE;
 
    public Thread countDownUntilAsync(final int threshold) {
        return new Thread(() -> {
            while (number>threshold) {
                number--;
                System.out.println("Decreased "+number +" at "+ new Date());
            }
        });
    }
 
    private void waitUntilThresholdReached(int threshold) {
        while (number>threshold) {
        }
    }
 
    public static void main(String[] args) {
        int threshold = 2125840327;
 
        UnSynchronizedCountDown unSynchronizedCountDown = new UnSynchronizedCountDown();
        unSynchronizedCountDown.countDownUntilAsync(threshold).start();
 
        unSynchronizedCountDown.waitUntilThresholdReached(threshold);
        System.out.println("Threshold reached at "+new Date());
    }
}

 

์ฃผ์–ด์ง„ ์ฝ”๋“œ๋Š” ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ€์‹œ์„ฑ๊ณผ ๋™๊ธฐํ™”์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ๋‹ค. 

์ฃผ์–ด์ง„ ์ฝ”๋“œ๋Š” ๋‘ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ 'number'๋ผ๋Š” ๋™์ผํ•œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…ํ•œ๋‹ค.

countDownUntilAsync()๋Š” 'number' ๋ฅผ ๊ฐ์†Œ์‹œํ‚ค๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. 

main()๋Š” 'number' ๊ฐ€ ํŠน์ • ์ž„๊ณ„๊ฐ’ ์ดํ•˜๋กœ ๋–จ์–ด์งˆ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

ํฌ๊ฒŒ  ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์ด ์กด์žฌํ•œ๋‹ค.

 

๋ฌธ์ œ์  1: ๋™๊ธฐํ™” ๋ถ€์กฑ

Java์—์„œ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ™์€ ๋ณ€์ˆ˜๋ฅผ ๋™์‹œ์— ์ ‘๊ทผํ•˜๊ณ  ๋ณ€๊ฒฝํ•  ๋•Œ, ์ด ๋ณ€์ˆ˜๋ฅผ ๋™๊ธฐํ™”ํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ณ€์ˆ˜ number๊ฐ€ ๋‘ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ์—์„œ ๋™์‹œ ์ ‘๊ทผ์„ ํ•œ๋‹ค
  • ์ฒซ ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ๋Š” ๋ณ€์ˆซ๊ฐ’ ๊ฐ์†Œ, ๋‘ ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ฝ๊ณ  ์žˆ๋‹ค
  • ์—ฌ๊ธฐ์„œ, ๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— number์— ์ ‘๊ทผํ•  ๋•Œ ์ด๋ฅผ ์ ์ ˆํžˆ ๋™๊ธฐํ™”ํ•˜์ง€ ์•Š์•„, ๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ ์„œ๋กœ์˜ ์ž‘์—… ๊ฒฐ๊ณผ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ธ์‹ํ•˜์ง€ ๋ชปํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค

 

๋ฌธ์ œ์  2: ๋ฉ”๋ชจ๋ฆฌ ๊ฐ€์‹œ์„ฑ ๋ฌธ์ œ

๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž์‹ ๋งŒ์˜ ์บ์‹œ๋ฅผ ๊ฐ€์ง€๊ณ  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ํŠน์ • ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ๊ทธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐ”๋กœ ์ธ์‹ํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฒซ ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ๋Š” number๋ฅผ ๊ฐ์†Œ์‹œํ‚ค์ง€๋งŒ, ๋ฉ”์ธ์—์„œ๋Š” ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์—†๋‹ค.
  • ๋”ฐ๋ผ์„œ, ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” number ๊ฐ’์ด ์ž„๊ณ„๊ฐ’ ์ดํ•˜๋กœ ๋–จ์–ด์ ธ๋„ ์ด๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•ด ๋ฌดํ•œ ๋ฃจํ”„์— ๋น ์งˆ ์ˆ˜ ์žˆ

 

 

 

ํ•ด๊ฒฐโžก๏ธ ๋™๊ธฐํ™”(synchronized) ์‚ฌ์šฉ

  • synchronized ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ๋ณ€์ˆ˜ number์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค
  • synchroinzed ๋ธ”๋ก์— ๊ฑธ๋ ค ๋„˜์–ด์ง„ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์Šค๋ ˆ๋“œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค
package com.gkatzioura.concurrency.visibility;
 
 
public class SynchronizedCountDown {
    private int number = Integer.MAX_VALUE;
    private String message = "Nothing changed";
    private static final Object lock = new Object();
 
    private int getNumber() {
        synchronized (lock) {
            return number;
        }
    }
 
    public Thread countDownUntilAsync(final int threshold) {
        return new Thread(() -> {
            message = "Count down until "+threshold;
            while (number>threshold) {
                synchronized (lock) {
                    number--;
                    if(number<=threshold) {
                    }
                }
            }
        });
    }
 
    private void waitUntilThresholdReached(int threshold) {
        while (getNumber()>threshold) {
        }
    }
 
    public static void main(String[] args) {
        int threshold = 2147270516;
 
        SynchronizedCountDown synchronizedCountDown = new SynchronizedCountDown();
        synchronizedCountDown.countDownUntilAsync(threshold).start();
        System.out.println(synchronizedCountDown.message);
 
        synchronizedCountDown.waitUntilThresholdReached(threshold);
        System.out.println(synchronizedCountDown.message);
    }
}

 

getNumber()์—์„œ ๋™๊ธฐํ™” ๋ธ”๋ก์„ ํ†ตํ•ด number ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ด๋กœ ์ธํ•ด ํ•ด๋‹น ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•˜๋Š” ์Šค๋ ˆ๋“œ๋Š” lock ๊ฐ์ฒด๋ฅผ ์ž ๊ถˆ, ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•ด๋‹น ๋ธ”๋ก์— ๋“ค์–ด์˜ค๋Š” ๊ฒƒ์„ ๋ง‰๋Š”๋‹ค.

 

countDownUntilAsync()์—์„œ number ๊ฐ์†Œ์‹œํ‚ค๋Š” ๋กœ์ง์„ ๋ธ”๋ก ์•ˆ์— ๋„ฃ์–ด, lock ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž ๊ทผ๋‹ค.

number ๋ณ€์ˆ˜ ๊ฐ’ ๋ณ€๊ฒฝ์ด ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—๋„ ์ž˜ ๋ฐ˜์˜๋˜๋„๋ก ํ•œ๋‹ค.

 

 

์œ„ ์ˆ˜์ •๋œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๊ฐ€์‹œ์„ฑ์ด ๋ณด์žฅ๋œ๋‹ค.

 

 

 

โž•

Java ๊ฐ€์‹œ์„ฑ ๋ณด์žฅ?

์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์ผํ•œ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ๋•Œ, ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•œ ๊ฒƒ์ด ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ๋„ ์ฆ‰์‹œ ํ™•์ธ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ
โžก๏ธ ์Šค๋ ˆ๋“œ ๊ฐ„์— ์ผ๊ด€๋œ ๋ฐ์ดํ„ฐ ๊ณต์œ ๋ฅผ ๋ณด์žฅ
  • synchronized ๋ธ”๋ก์ด ์‚ฌ์šฉ๋˜๋ฉด, ํ•ด๋‹น ๋ธ”๋ก ๋‚ด์—์„œ ๋ณ€๊ฒฝ๋œ ๋ชจ๋“  ๋ณ€์ˆ˜์˜ ์ƒํƒœ๋Š” ๋ธ”๋ก์ด ๋๋‚  ๋•Œ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ˜์˜๋จ
  • ์ด๋กœ ์ธํ•ด, ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์ผํ•œ lock์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™๊ธฐํ™”๋œ ๋ธ”๋ก์— ์ ‘๊ทผํ•  ๋•Œ ๋ณ€์ˆ˜์˜ ์ตœ์‹  ๊ฐ’์„ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค

 

 

 


 

๐Ÿค” ์ด์— ๋Œ€ํ•œ ๋‚˜์˜ ์ƒ๊ฐ

๋””๋ฒ„๊น…์œผ๋กœ ๋ณด์ด์ง€ ์•Š๋Š” ์˜ค๋ฅ˜๋ผ, ๊ฐ€์‹œ์„ฑ ๋ฌธ์ œ์˜ ์ค‘์š”์„ฑ์ด ๋†’๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

๋‚˜ ๋˜ํ•œ ๊ฐ€์‹œ์„ฑ์˜ ์ค‘์š”์„ฑ์„ ํฌ๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์—ˆ๋Š”๋ฐ, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘์ด ๋ฐœ์ƒํ•˜๊ณ  ํŠนํžˆ ๋””๋ฒ„๊น…์ด ์–ด๋ ต๋‹ค๋Š” ์ ์—์„œ ์ค‘์š”ํ•จ์„ ๊นจ๋‹ฌ์•˜๋‹ค.

synchronized๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์„ฑ๋Šฅ ๋น„์šฉ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ์Šค๋ ˆ๋“œ์˜ ์ž์› ๋Œ€๊ธฐ ์‹œ๊ฐ„์€ ๊ณง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ๊ณผ๋„ ์—ฐ๊ฒฐ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฌด์ž‘์ • ๋™๊ธฐํ™”๋ฅผ ์ฑ™๊ธฐ๊ธฐ๋ณด๋‹ค "์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ" ์ด ์ค‘์š”ํ•ด ๋ณด์ธ๋‹ค.