JavaRush /Java Blog /Random-KO /์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”, ๊ฐ์ฒด ์ž ๊ธˆ ๋ฐ ํด๋ž˜์Šค ์ž ๊ธˆ
CynepHy6
๋ ˆ๋ฒจ 34
ะ’ะตะปะธะบะธะน ะะพะฒะณะพั€ะพะด

์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”, ๊ฐ์ฒด ์ž ๊ธˆ ๋ฐ ํด๋ž˜์Šค ์ž ๊ธˆ

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

๊ฐ์ฒด ์ˆ˜์ค€ ์ž ๊ธˆ

์ด๋Š” ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ํด๋ž˜์Šค์˜ ์ง€์ •๋œ ์ธ์Šคํ„ด์Šค์—์„œ ์ง€์ •๋œ ๋ธ”๋ก์ด๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋น„์ •์  ๋ฉ”์„œ๋“œ ๋˜๋Š” ๋น„์ •์  ์ฝ”๋“œ ๋ธ”๋ก์„ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค ์ˆ˜์ค€ ๋ฐ์ดํ„ฐ ์Šค๋ ˆ๋“œ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•  ๋•Œ๋งˆ๋‹ค ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ:
public class DemoClass{
    public synchronized void demoMethod(){}
}
๋˜๋Š”
public class DemoClass{
    public void demoMethod(){
        synchronized (this)        {
            //other thread safe code
        }
    }
}
๋˜๋Š”
public class DemoClass{
    private final Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

ํด๋ž˜์Šค ์ˆ˜์ค€ ์ž ๊ธˆ

ํด๋ž˜์Šค์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ธ์Šคํ„ด์Šค์—์„œ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™๊ธฐํ™”๋œ ๋ธ”๋ก์— ์ง„์ž…ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ 100๊ฐœ๋ผ๋ฉด ์–ด๋–ค DemoClass๊ฒฝ์šฐ๋“  ํ•ด๋‹น ์‹œ์ ์— ๋‹จ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ demoMethod()์žˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒฝ์šฐ๋Š” ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•ด ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ •์  ๋ฐ์ดํ„ฐ ์Šค๋ ˆ๋“œ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•  ๋•Œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
public class DemoClass{
    public synchronized static void demoMethod(){}
}
๋˜๋Š”
public class DemoClass{
    public void demoMethod(){
        synchronized (DemoClass.class)        {
            //other thread safe code
        }
    }
}
๋˜๋Š”
public class DemoClass
{
    private final static Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ฐธ๊ณ  ์‚ฌํ•ญ

  1. Java์˜ ๋™๊ธฐํ™”๋Š” ๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ๋˜๋Š” ๋ณ‘๋ ฌ๋กœ ๋™๊ธฐํ™”๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

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

  3. ์Šค๋ ˆ๋“œ๊ฐ€ ๋™๊ธฐํ™”๋œ ๋ฉ”์„œ๋“œ๋‚˜ ๋ธ”๋ก์— ๋“ค์–ด๊ฐˆ ๋•Œ๋งˆ๋‹ค ์ž ๊ธˆ์„ ํš๋“ํ•˜๊ณ  ์Šค๋ ˆ๋“œ๊ฐ€ ๋™๊ธฐํ™”๋œ ๋ฉ”์„œ๋“œ๋‚˜ ๋ธ”๋ก์„ ์ข…๋ฃŒํ•  ๋•Œ๋งˆ๋‹ค JVM์ด ์ž ๊ธˆ์„ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋‚˜ ์˜ˆ์™ธ๋กœ ์ธํ•ด ์Šค๋ ˆ๋“œ๊ฐ€ ์™„๋ฃŒ ํ›„ ๋™๊ธฐํ™”๋œ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฒ—์–ด๋‚˜๋”๋ผ๋„ ์ž ๊ธˆ์ด ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.

  4. synchronizedJava์—์„œ ์ด๋Š” ๋™๊ธฐํ™”๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ๋™์ผํ•œ ์ž ๊ธˆ์ด ํ•„์š”ํ•œ ๋‹ค๋ฅธ ๋™๊ธฐํ™”๋œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ ์ž ๊ธˆ์„ ๋ณด์œ ํ•˜๋Š” ํ˜„์žฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž ๊ธˆ์„ ํš๋“ํ•˜์ง€ ์•Š๊ณ ๋„ ํ•ด๋‹น ๋ฉ”์„œ๋“œ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  5. ะกะธะฝั…ั€ะพะฝะธะทะฐั†ะธั ะฒ Java ะฑัƒะดะตั‚ ะฑั€ะพัะฐั‚ัŒ NullPointerException ะตัะปะธ an object ะธัะฟะพะปัŒะทัƒะตะผั‹ะน ะฒ ัะธะฝั…ั€ะพะฝะธะทะธั€ะพะฒะฐะฝะฝะพะผ ะฑะปะพะบะต null. ะะฐะฟั€ะธะผะตั€, ะฒ ะฒั‹ัˆะตะฟั€ะธะฒะตะดะตะฝะฝะพะผ ะฟั€ะธะผะตั€ะต codeะฐ, ะตัะปะธ ะทะฐะผะพะบ ะธะฝะธั†ะธะฐะปะธะทะธั€ัƒะตั‚ัั How null, ัะธะฝั…ั€ะพะฝะธะทะธั€ะพะฒะฐะฝะฝั‹ะน (lock) ะฑั€ะพัะธั‚ NullPointerException.

  6. ะกะธะฝั…ั€ะพะฝะธะทะธั€ะพะฒะฐะฝะฝั‹ะต ะผะตั‚ะพะดั‹ ะฒ Java ะฒะฝะพััั‚ ะดะพะฟะพะปะฝะธั‚ะตะปัŒะฝั‹ะต ะทะฐั‚ั€ะฐั‚ั‹ ะฝะฐ ะฟั€ะพะธะทะฒะพะดะธั‚ะตะปัŒะฝะพัั‚ัŒ ะฒะฐัˆะตะณะพ applications. ะขะฐะบ ั‡ั‚ะพ ะธัะฟะพะปัŒะทัƒะนั‚ะต ัะธะฝั…ั€ะพะฝะธะทะฐั†ะธัŽ, ะบะพะณะดะฐ ะพะฝะฐ ะฐะฑัะพะปัŽั‚ะฝะพ ะฝะตะพะฑั…ะพะดะธะผะฐ. ะšั€ะพะผะต ั‚ะพะณะพ, ั€ะฐััะผะพั‚ั€ะธั‚ะต ะฒะพะฟั€ะพั ะพะฑ ะธัะฟะพะปัŒะทะพะฒะฐะฝะธะธ ัะธะฝั…ั€ะพะฝะธะทะธั€ะพะฒะฐะฝะฝั‹ั… ะฑะปะพะบะพะฒ codeะฐ ะดะปั ัะธะฝั…ั€ะพะฝะธะทะฐั†ะธะธ ั‚ะพะปัŒะบะพ ะบั€ะธั‚ะธั‡ะตัะบะธั… ัะตะบั†ะธะน codeะฐ.

  7. ะ’ะฟะพะปะฝะต ะฒะพะทะผะพะถะฝะพ, ั‡ั‚ะพ ะธ ัั‚ะฐั‚ะธั‡ะตัะบะธะน ะธ ะฝะต ัั‚ะฐั‚ะธั‡ะตัะบะธะน ัะธะฝั…ั€ะพะฝะธะทะธั€ะพะฒะฐะฝะฝั‹ะต ะผะตั‚ะพะดั‹ ะผะพะณัƒั‚ ั€ะฐะฑะพั‚ะฐั‚ัŒ ะพะดะฝะพะฒั€ะตะผะตะฝะฝะพ or ะฟะฐั€ะฐะปะปะตะปัŒะฝะพ, ะฟะพั‚ะพะผัƒ ั‡ั‚ะพ ะพะฝะธ ะทะฐั…ะฒะฐั‚ั‹ะฒะฐัŽั‚ ะทะฐะผะพะบ ะฝะฐ ะดั€ัƒะณะพะน an object.

  8. ะ’ ัะพะพั‚ะฒะตั‚ัั‚ะฒะธะธ ัะพ ัะฟะตั†ะธั„ะธะบะฐั†ะธะตะน ัะทั‹ะบะฐ ะฒั‹ ะฝะต ะผะพะถะตั‚ะต ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ synchronized ะฒ ะบะพะฝัั‚ั€ัƒะบั‚ะพั€ะต ัั‚ะพ ะฟั€ะธะฒะตะดะตั‚ ะบ ะพัˆะธะฑะบะต ะบะพะผะฟะธะปัั†ะธะธ.

  9. ะะต ัะธะฝั…ั€ะพะฝะธะทะธั€ัƒะนั‚ะต ะฟะพ ะฝะต ั„ะธะฝะฐะปัŒะฝะพะผัƒ (no final) ะฟะพะปัŽ, ะฟะพั‚ะพะผัƒ ั‡ั‚ะพ link, ะฝะฐ ะฝะต ั„ะธะฝะฐะปัŒะฝะพะต ะฟะพะปะต ะผะพะถะตั‚ ะธะทะผะตะฝะธั‚ัŒัั ะฒ ะปัŽะฑะพะต ะฒั€ะตะผั, ะฐ ะทะฐั‚ะตะผ ะดั€ัƒะณะพะน ะฟะพั‚ะพะบ ะผะพะถะตั‚ ะฟะพะปัƒั‡ะธั‚ัŒ ัะธะฝั…ั€ะพะฝะธะทะฐั†ะธัŽ ะฝะฐ ั€ะฐะทะฝั‹ั… an objectั… ะธ ัƒะถะต ะฝะต ะฑัƒะดะตั‚ ะฝะธHowะพะน ัะธะฝั…ั€ะพะฝะธะทะฐั†ะธะธ ะฒะพะพะฑั‰ะต. ะ›ัƒั‡ัˆะต ะฒัะตะณะพ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะบะปะฐัั String, ะบะพั‚ะพั€ั‹ะน ัƒะถะต ะฝะตะธะทะผะตะฝัะตะผั‹ะน ะธ ั„ะธะฝะฐะปัŒะฝั‹ะน.

ะฃะดะฐั‡ะธ ะฒ ะพะฑัƒั‡ะตะฝะธะธ!! ะžั€ะธะณะธะฝะฐะป: Object level lock vs Class level lock in Java
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION