CodeGym/Java Blog/๋ฌด์ž‘์œ„์˜/์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”. ๋™๊ธฐํ™”๋œ ์—ฐ์‚ฐ์ž
John Squirrels
๋ ˆ๋ฒจ 41
San Francisco

์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”. ๋™๊ธฐํ™”๋œ ์—ฐ์‚ฐ์ž

๋ฌด์ž‘์œ„์˜ ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
ํšŒ์›
์•ˆ๋…•! ์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” ๊ณ„์†ํ•ด์„œ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ธฐ๋Šฅ์„ ๊ณ ๋ คํ•˜๊ณ  ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”.  ๋™๊ธฐํ™” ์—ฐ์‚ฐ์ž - 1

Java์—์„œ ๋™๊ธฐํ™”๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์˜์—ญ ๋ฐ–์—์„œ๋Š” ๋‘ ๊ฐœ์˜ ์žฅ์น˜ ๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๋ฐฐ์—ด์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์Šค๋งˆํŠธํฐ๊ณผ ์ปดํ“จํ„ฐ๋ฅผ Google ๊ณ„์ •๊ณผ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๊ณ , ์›น์‚ฌ์ดํŠธ ๊ณ„์ •์„ ์†Œ์…œ ๋„คํŠธ์›Œํฌ ๊ณ„์ •๊ณผ ๋™๊ธฐํ™”ํ•˜์—ฌ ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”๋Š” ์œ ์‚ฌํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์„œ๋กœ. ์ด์ „ ํ•™์Šต์—์„œ๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ์„œ๋กœ ๋ณ„๋„๋กœ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ–ˆ๊ณ , ๋‘ ๋ฒˆ์งธ๋Š” ์ž ์„ ์žค๊ณ , ์„ธ ๋ฒˆ์งธ๋Š” ์ฝ˜์†”์— ๋ฌด์–ธ๊ฐ€๋ฅผ ํ‘œ์‹œํ–ˆ์ง€๋งŒ ์ƒํ˜ธ ์ž‘์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์ด ๊ฑฐ์˜ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ…์ŠคํŠธ ํŒŒ์ผ์ด๋‚˜ ์ฝ˜์†”๊ณผ ๊ฐ™์€ ๋™์ผํ•œ ์œ„์น˜์— ํ…์ŠคํŠธ๋ฅผ ์“ฐ๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ์ด ๊ฒฝ์šฐ ํŒŒ์ผ ๋˜๋Š” ์ฝ˜์†”์€ ๊ณต์œ  ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๋Š” ์„œ๋กœ์˜ ์กด์žฌ๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋ฏ€๋กœ ์Šค๋ ˆ๋“œ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ํ• ๋‹นํ•œ ์‹œ๊ฐ„ ๋‚ด์— ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ตœ๊ทผ ์ˆ˜์—…์—์„œ ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์ด ์–ด๋””๋กœ ์ด์–ด์ง€๋Š”์ง€์— ๋Œ€ํ•œ ์˜ˆ๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๊ธฐ์–ตํ•ด ๋ด…์‹œ๋‹ค. ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”.  ๋™๊ธฐํ™” ์—ฐ์‚ฐ์ž - 2๊ทธ ์ด์œ ๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ์„œ๋กœ ์ž‘์—…์„ ์กฐ์ •ํ•˜์ง€ ์•Š๊ณ  ๊ณต์œ  ๋ฆฌ์†Œ์Šค(์ฝ˜์†”)์™€ ํ•จ๊ป˜ ์ž‘์—…ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ Thread-1์— ์‹œ๊ฐ„์„ ํ• ๋‹นํ•˜๋ฉด ์ฆ‰์‹œ ๋ชจ๋“  ๊ฒƒ์„ ์ฝ˜์†”์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ด๋ฏธ ์ž‘์„ฑํ–ˆ๊ฑฐ๋‚˜ ์•„์ง ์ž‘์„ฑํ•˜์ง€ ์•Š์€ ๊ฒƒ์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ ๊ฒฐ๊ณผ๋Š” ์šฐ์šธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋ฎคํ…์Šค(์ƒํ˜ธ ๋ฐฐ์ œ) ๋ผ๋Š” ํŠน๋ณ„ํ•œ ๊ฐœ๋…์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฎคํ…์Šค์˜ ๋ชฉ์ ํŠน์ • ์‹œ๊ฐ„์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ๊ฐœ์ฒด์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Thread-1์ด ๊ฐœ์ฒด A์˜ ๋ฎคํ…์Šค๋ฅผ ํš๋“ํ•˜๋ฉด ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋Š” ๊ฐœ์ฒด์— ์•ก์„ธ์Šคํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋Š” ๊ฐœ์ฒด A์˜ ๋ฎคํ…์Šค๊ฐ€ ํ•ด์ œ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์‚ถ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. ๊ท€ํ•˜์™€ ๋‹ค๋ฅธ 10๋ช…์˜ ๋‚ฏ์„  ์‚ฌ๋žŒ๋“ค์ด ์šด๋™์— ์ฐธ์—ฌํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ๋ฒˆ๊ฐˆ์•„ ๊ฐ€๋ฉฐ ์•„์ด๋””์–ด๋ฅผ ํ‘œํ˜„ํ•˜๊ณ  ๋ฌด์–ธ๊ฐ€๋ฅผ ๋…ผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์„œ๋กœ ์ฒ˜์Œ ๋ณด๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋Š์ž„์—†์ด ์„œ๋กœ๋ฅผ ๋ฐฉํ•ดํ•˜๊ณ  ํ™”๋ฅผ ๋‚ด์ง€ ์•Š๊ธฐ ์œ„ํ•ด '๋งํ•˜๋Š” ๊ณต'์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ณต์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ๋งŒ ๋ง์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ›Œ๋ฅญํ•˜๊ณ  ์œ ์ตํ•œ ํ† ๋ก ์„ ๋๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ณต์€ ๋ฎคํ…์Šค์ž…๋‹ˆ๋‹ค. ๊ฐœ์ฒด์˜ ๋ฎคํ…์Šค๊ฐ€ ํ•œ ์Šค๋ ˆ๋“œ์˜ ์†์— ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋Š” ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.Object์ด๋Š” Java์˜ ๋ชจ๋“  ๊ฐœ์ฒด์— ํ•˜๋‚˜์”ฉ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋™๊ธฐํ™” ์—ฐ์‚ฐ์ž ์ž‘๋™ ๋ฐฉ์‹

์ƒˆ ํ‚ค์›Œ๋“œ์ธ synchronized ์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค . ํŠน์ • ์ฝ”๋“œ ๋ธ”๋ก์„ ํ‘œ์‹œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋ธ”๋ก์— synchronizedํ‚ค์›Œ๋“œ๊ฐ€ ํ‘œ์‹œ๋œ ๊ฒฝ์šฐ ํ•ด๋‹น ๋ธ”๋ก์€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ์—์„œ๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™๊ธฐํ™”๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ „์ฒด ๋ฉ”์„œ๋“œ๋ฅผ ๋™๊ธฐํ™”ํ•˜๋„๋ก ์„ ์–ธํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
public synchronized void doSomething() {

   // ...Method logic
}
๋˜๋Š” ์ผ๋ถ€ ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™๊ธฐํ™”๊ฐ€ ์ˆ˜ํ–‰๋˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
public class Main {

   private Object obj = new Object();

   public void doSomething() {

       // ...Some logic available simultaneously to all threads

       synchronized (obj) {

           // Logic available to just one thread at a time
       }
   }
}
์˜๋ฏธ๋Š” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ํ‚ค์›Œ๋“œ๋กœ ํ‘œ์‹œ๋œ ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด๋ถ€๋กœ ๋“ค์–ด๊ฐ€๋ฉด synchronized์ฆ‰์‹œ ๊ฐœ์ฒด์˜ ๋ฎคํ…์Šค๋ฅผ ์บก์ฒ˜ํ•˜๊ณ  ๋™์ผํ•œ ๋ธ”๋ก์ด๋‚˜ ๋ฉ”์„œ๋“œ์— ๋“ค์–ด๊ฐ€๋ ค๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋Š” ์ด์ „ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž‘์—…์„ ์™„๋ฃŒํ•˜๊ณ  ๋ชจ๋‹ˆํ„ฐ๋ฅผ ํ•ด์ œํ•  ๋•Œ๊นŒ์ง€ ๊ฐ•์ œ๋กœ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”.  ๋™๊ธฐํ™”๋œ ์—ฐ์‚ฐ์ž - 3๊ทธ๋Ÿฐ๋ฐ! ๊ณผ์ • ์ค‘์— ์ด๋ฏธ ์˜ ์˜ˆ๋ฅผ ๋ณด์•˜์ง€๋งŒ synchronized๋‹ค๋ฅด๊ฒŒ ๋ณด์˜€์Šต๋‹ˆ๋‹ค.
public void swap()
{
   synchronized (this)
   {
       // ...Method logic
   }
}
์ฃผ์ œ๋Š” ๋‹น์‹ ์—๊ฒŒ ์ƒˆ๋กœ์šด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฌผ๋ก  ๊ตฌ๋ฌธ์— ํ˜ผ๋™์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚˜์ค‘์— ๋‹ค๋ฅธ ์ž‘์„ฑ ๋ฐฉ๋ฒ•์œผ๋กœ ํ˜ผ๋™๋˜์ง€ ์•Š๋„๋ก ์ฆ‰์‹œ ์•”๊ธฐํ•˜์‹ญ์‹œ์˜ค. ์ด ๋‘ ๊ฐ€์ง€ ์ž‘์„ฑ ๋ฐฉ๋ฒ•์€ ๊ฐ™์€ ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
public void swap() {

   synchronized (this)
   {
       // ...Method logic
   }
}


public synchronized void swap() {

   }
}
์ฒซ ๋ฒˆ์งธ ๊ฒฝ์šฐ ๋ฉ”์„œ๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋Š” ์ฆ‰์‹œ ๋™๊ธฐํ™”๋œ ์ฝ”๋“œ ๋ธ”๋ก์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. this๊ฐ์ฒด, ์ฆ‰ ํ˜„์žฌ ๊ฐ์ฒด ์— ์˜ํ•ด ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค . ๋‘ ๋ฒˆ์งธ ์˜ˆ์—์„œ๋Š” synchronizedํ‚ค์›Œ๋“œ๋ฅผ ์ „์ฒด ๋ฉ”์„œ๋“œ์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋™๊ธฐํ™”์— ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ์ฒด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œ์‹œํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ „์ฒด ๋ฉ”์„œ๋“œ๊ฐ€ ํ‚ค์›Œ๋“œ๋กœ ํ‘œ์‹œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์„œ๋“œ๋Š” ํด๋ž˜์Šค์˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•ด ์ž๋™์œผ๋กœ ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์–ด๋–ค ๋ฐฉ๋ฒ•์ด ๋” ๋‚˜์€์ง€์— ๋Œ€ํ•œ ๋…ผ์˜์— ๋›ฐ์–ด๋“ค์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๊ฐ€์žฅ ๋งˆ์Œ์— ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜์„ธ์š” :) ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ ์€ ๋ชจ๋“  ๋…ผ๋ฆฌ๊ฐ€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ์— ์˜ํ•ด ์‹คํ–‰๋  ๋•Œ๋งŒ ๋™๊ธฐํ™”๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ๋ฉ”์„œ๋“œ๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ˆ˜์ž…๋‹ˆ๋‹ค doSomething().
public class Main {

   private Object obj = new Object();

   public void doSomething() {

       // ...Some logic available simultaneously to all threads

       synchronized (obj) {

           // Logic available to just one thread at a time
       }
   }
}
๋ณด์‹œ๋‹ค์‹œํ”ผ ๋ฉ”์„œ๋“œ์˜ ์ผ๋ถ€์—๋Š” ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋…ผ๋ฆฌ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋Š” ๋™์‹œ์— ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ชจ๋“  ์ค‘์š”ํ•œ ์œ„์น˜๋Š” ๋ณ„๋„์˜ synchronized๋ธ”๋ก์— ๋”ฐ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•˜๋‚˜ ๋”. ์ด๋ฆ„ ๊ตํ™˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์—…์—์„œ ์‚ฌ์šฉํ•œ ์˜ˆ๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
public void swap()
{
   synchronized (this)
   {
       // ...Method logic
   }
}
์ฐธ๊ณ : ๋™๊ธฐํ™”๋Š” ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹คthis. ์ฆ‰, ํŠน์ •MyClass๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Thread-12๊ฐœ์˜ ์Šค๋ ˆ๋“œ( ๋ฐThread-2)์™€ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹คMyClass myClass. ์ด ๊ฒฝ์šฐThread-1ํ˜ธ์ถœํ•˜๋ฉดmyClass.swap()๊ฐœ์ฒด์˜ ๋ฎคํ…์Šค๊ฐ€ ์‚ฌ์šฉ ์ค‘์ด๋ฉฐ ํ˜ธ์ถœ์„ ์‹œ๋„ํ•˜๋ฉด๋ฎคํ…์Šค๊ฐ€ ํ•ด์ œ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆmyClass.swap()๋ฉ”์„œ๋“œ๊ฐ€2๊ฐœ์˜ ์Šค๋ ˆ๋“œ์™€ 2๊ฐœ์˜ ๊ฐœ์ฒด(๋ฐThread-2๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์Šค๋ ˆ๋“œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐœ์ฒด์—์„œ ๋™๊ธฐํ™”๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์‰ฝ๊ฒŒ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ๋Š” ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. MyClassmyClass1myClass2
myClass1.swap();
๋‘ ๋ฒˆ์งธ๋Š” ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
myClass2.swap();
์ด ๊ฒฝ์šฐ ํŠน์ • ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™๊ธฐํ™”๊ฐ€ ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ ๋ฉ”์„œ๋“œ synchronized๋‚ด๋ถ€์˜ ํ‚ค์›Œ๋“œ๋Š” swap()ํ”„๋กœ๊ทธ๋žจ ์ž‘์—…์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ›„์ž์˜ ๊ฒฝ์šฐ 2๊ฐœ์˜ ๊ฐœ์ฒด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์Šค๋ ˆ๋“œ๋Š” ์„œ๋กœ์—๊ฒŒ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ, ๋‘ ๊ฐœ์ฒด์—๋Š” ๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฎคํ…์Šค๊ฐ€ ์žˆ์œผ๋ฉฐ ํ•˜๋‚˜๋ฅผ ํš๋“ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ํ•˜๋‚˜๋ฅผ ํš๋“ํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค .

์ •์  ๋ฉ”์„œ๋“œ์—์„œ ๋™๊ธฐํ™”์˜ ํŠน์ˆ˜ ๊ธฐ๋Šฅ

๊ทธ๋Ÿฌ๋‚˜ ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ๋™๊ธฐํ™”ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ ?
class MyClass {
   private static String name1 = "Ally";
   private static String name2 = "Lena";

   public static synchronized void swap() {
       String s = name1;
       name1 = name2;
       name2 = s;
   }

}
์—ฌ๊ธฐ์„œ ๋ฎคํ…์Šค๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€๋Š” ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๊ฐ ๊ฐœ์ฒด์— ๋ฎคํ…์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ๊ฐœ์ฒด๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค MyClass.swap(). ๋ฉ”์„œ๋“œ๋Š” ์ •์ ์ž…๋‹ˆ๋‹ค! ๋‹ค์Œ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? :/ ์‹ค์ œ๋กœ ์—ฌ๊ธฐ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Java ์ž‘์„ฑ์ž๊ฐ€ ๋ชจ๋“  ๊ฒƒ์„ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค :) ์ค‘์š”ํ•œ ๋™์‹œ ๋…ผ๋ฆฌ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์ ์ด๋ฉด ํด๋ž˜์Šค ์ˆ˜์ค€์—์„œ ๋™๊ธฐํ™”๊ฐ€ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
class MyClass {
   private static String name1 = "Ally";
   private static String name2 = "Lena";

   public static void swap() {

       synchronized (MyClass.class) {
           String s = name1;
           name1 = name2;
           name2 = s;
       }
   }

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