๋‚ด์ผ๋ฐฐ์›€์บ ํ”„

JAVA 5์ฃผ์ฐจ: ์“ฐ๋ ˆ๋“œ

KIMHYEYUN 2023. 10. 23. 19:44
๋ฐ˜์‘ํ˜•

๐Ÿ‘ท ์“ฐ๋ ˆ๋“œ(์ผ๊พผ)

ํ”„๋กœ์„ธ์Šค์™€ ์“ฐ๋ ˆ๋“œ

๐Ÿ“Œ ํ”„๋กœ์„ธ์Šค vs ์“ฐ๋ ˆ๋“œ

ํ”„๋กœ์„ธ์Šค : ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ ์ž์›์„ ํ• ๋‹น๋ฐ›๋Š” ์ž‘์—…์˜ ๋‹จ์œ„

  • ์“ฐ๋ ˆ๋“œ : ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ• ๋‹น๋ฐ›์€ ์ž์›์„ ์ด์šฉํ•˜๋Š” ์‹คํ–‰์˜ ๋‹จ์œ„

ํ”„๋กœ์„ธ์Šค

  • ์‹คํ–‰์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์„ ์˜๋ฏธ
  • OS ์œ„์—์„œ ์‹คํ–‰๋˜๋Š” ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ์€ OS๊ฐ€ ๋งŒ๋“ค์–ด์ค€ ํ”„๋กœ์„ธ์Šค์—์„œ ์‹คํ–‰๋จํ”„๋กœ์„ธ์Šค
  • ๊ตฌ์กฐ
    • OS๊ฐ€ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์„ ์œ„ํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ• ๋‹นํ•ด์ค„๋•Œ ํ”„๋กœ์„ธ์Šค ์•ˆ์— ํ”„๋กœ๊ทธ๋žจ code์™€ data ๊ทธ๋ฆฌ๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ(stack, heap)์„ ํ•จ๊ป˜ ํ• ๋‹น
    1. code ๋Š” java main ๋ฉ”์†Œ๋“œ์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์˜๋ฏธ
    2. data๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰ ์ค‘ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ €์žฅ ๊ณต๊ฐ„์„ ์˜๋ฏธ
      • ์ „์—ญ ๋ณ€์ˆ˜, ์ •์  ๋ณ€์ˆ˜(static), ๋ฐฐ์—ด ๋“ฑ ์ดˆ๊ธฐํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„
    3. memory
      • stack : ์ง€์—ญ ๋ณ€์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฆฌํ„ด ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„
      • heap : ํ”„๋กœ๊ทธ๋žจ์ด ๋™์ ์œผ๋กœ ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„(new(), malloc())

ํ”„๋กœ์„ธ์Šค ๋“ค

์“ฐ๋ ˆ๋“œ

  • ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ์ผํ•˜๋Š” ์ผ๊พผ (์ฝ”๋“œ ์‹คํ–‰์˜ ํ๋ฆ„)
  • ์ƒ์„ฑ
    • ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž‘์—… ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‹คํ–‰ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์“ฐ๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๋ช…๋ น์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•จ
  • ์ž์›
    • ํ”„๋กœ์„ธ์Šค ์•ˆ์—๋Š” ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์žˆ๊ณ , ์“ฐ๋ ˆ๋“œ๋“ค์€ ์‹คํ–‰์„ ์œ„ํ•œ ํ”„๋กœ์„ธ์Šค ๋‚ด ์ฃผ์†Œ ๊ณต๊ฐ„์ด๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„(heap)์„ ๊ณต์œ  ๋ฐ›์Œ
      • ๊ฐ๊ฐ ๋ช…๋ น ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ž์‹ ๋งŒ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„(stack)๋„ ํ• ๋‹น ๋ฐ›์Œ

ํ”„๋กœ์„ธ์Šค ๋‚ด์˜ ์“ฐ๋ ˆ๋“œ

  • java ์“ฐ๋ ˆ๋“œ
    • ์ผ๋ฐ˜ ์“ฐ๋ ˆ๋“œ์™€ ๋™์ผํ•˜๋ฉฐ JVM ํ”„๋กœ์„ธ์Šค ์•ˆ์—์„œ ์‹คํ–‰๋˜๋Š” ์“ฐ๋ ˆ๋“œ
    • Java ํ”„๋กœ๊ทธ๋žจ ์“ฐ๋ ˆ๋“œ๋Š” java Main ์“ฐ๋ ˆ๋“œ๋ถ€ํ„ฐ ์‹คํ–‰๋˜๋ฉฐ JVM์— ์˜ํ•ด ์‹คํ–‰๋จ

java ์“ฐ๋ ˆ๋“œ

๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ

java๋Š” ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ๊ฐ€ main() ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด์„œ ์‹œ์ž‘๋จ
- ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ๋Š” ํ•„์š”์— ๋”ฐ๋ผ์„œ ์ž‘์—… ์“ฐ๋ ˆ๋“œ๋“ค์„ ์ƒ์„ฑํ•ด์„œ ๋ณ‘๋ ฌ๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ

  • ์ฆ‰, java๋Š” ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ง€์›
  • ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ
    • ํ”„๋กœ์„ธ์Šค ์•ˆ์—์„œ ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๋งŒ ์‹คํ–‰๋˜๋Š” ๊ฒƒ
  • ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ
    • ํ”„๋กœ์„ธ์Šค ์•ˆ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ
    • ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์‹คํ–‰ ๋‹จ์œ„(์“ฐ๋ ˆ๋“œ)๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ์“ฐ๋ ˆ๋“œ๋“ค์€ ํ”„๋กœ์„ธ์Šค์˜ ์ž์›์„ ๊ณต์œ ํ•จ
    • ์žฅ์ 
      • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ(์‹คํ–‰ ํ๋ฆ„)์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์—…์„ ๋™์‹œ์— ํ•  ์ˆ˜ ์žˆ์–ด์„œ ์„ฑ๋Šฅ์ด ์ข‹์•„์ง
      • ์Šคํƒ์„ ์ œ์™ธํ•œ ๋ชจ๋“  ์˜์—ญ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž์›์„ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
      • ์‘๋‹ต ์“ฐ๋ ˆ๋“œ์™€ ์ž‘์—… ์“ฐ๋ ˆ๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ์‘๋‹ต์„ ํ•ด์ค„ ์ˆ˜ ์žˆ์Œ => ๋น„๋™๊ธฐ
    • ๋‹จ์ 
      • ๋™๊ธฐํ™” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ => ํ”„๋กœ์„ธ์Šค์˜ ์ž์›์„ ๊ณต์œ ํ•˜๋ฉด์„œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž์›์„ ์„œ๋กœ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋Š” ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธ
      • ๊ต์ฐฉ ์ƒํƒœ(๋ฐ๋“œ๋ฝ)์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ => ๋‘˜ ์ด์ƒ์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์„œ๋กœ์˜ ์ž์›์„ ์›ํ•˜๋Š” ์ƒํƒœ๊ฐ€ ๋˜์—ˆ์„ ๋•Œ ์„œ๋กœ ์ž‘์—…์ด ์ข…๋ฃŒ๋˜๊ธฐ๋งŒ์„ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ์ž‘์—…์„ ๋” ์ด์ƒ ์ง„ํ–‰ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋˜๋Š” ์ƒํƒœ

Thread์™€ Runnable

public class Main {
    public static void main(String[] args) {

        Runnable run = new TestRunnable();
        Thread thread = new Thread(run);

        thread.start();
    }
}

class TestRunnable implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i <100; i++) {
            System.out.print("$");
        }
    }
}
  • ๐Ÿ™‹‍โ™€๏ธ Thread๋ฅผ ์ง์ ‘ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  Runnable ์‚ฌ์šฉ?
    • java๋Š” ๋‹ค์ค‘ ์ƒ์†์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์ธํ„ฐํŽ˜์ด์Šค์ธ Runnable์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ™•์žฅ์„ฑ์— ๋งค์šฐ ์œ ๋ฆฌ !!

๋ฐ๋ชฌ ์“ฐ๋ ˆ๋“œ์™€ ์‚ฌ์šฉ์ž ์“ฐ๋ ˆ๋“œ

  • ๋ฐ๋ชฌ ์“ฐ๋ ˆ๋“œ
    • ๋ณด์ด์ง€ ์•Š๋Š” ๊ณณ(background)์—์„œ ์‹คํ–‰๋˜๋Š” ๋‚ฎ์€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„ ์“ฐ๋ ˆ๋“œ
    • ๋ณด์กฐ์ ์ธ ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋ฉฐ ๋Œ€ํ‘œ์ ์œผ๋กœ๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ(GC)๊ฐ€ ์žˆ์Œ
  • ์‚ฌ์šฉ์ž ์“ฐ๋ ˆ๋“œ
    • ๋ณด์ด๋Š” ๊ณณ(foreground)์—์„œ ์‹คํ–‰๋˜๋Š” ๋†’์€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„ ์“ฐ๋ ˆ๋“œ
    • ํ”„๋กœ๊ทธ๋žจ ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๋ฉฐ ๋Œ€ํ‘œ์ ์œผ๋กœ๋Š” ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์žˆ์Œ

์“ฐ๋ ˆ๋“œ ์ƒํƒœ์™€ ์ œ์–ด

์“ฐ๋ ˆ๋“œ ์ƒํƒœ

์ƒํƒœ Enum ์„ค๋ช…
๊ฐ์ฒด ์ƒ์„ฑ NEW ์“ฐ๋ ˆ๋“œ ๊ฐ์ฒด ์ƒ์„ฑ, ์•„์ง start() ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ „์˜ ์ƒํƒœ
์‹คํ–‰ ๋Œ€๊ธฐ RUNNABLE ์‹คํ–‰ ์ƒํƒœ๋กœ ์–ธ์ œ๋“ ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ
์ผ์‹œ์ •์ง€ WAITING ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ํ†ต์ง€(notify)ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํƒœ
์ผ์‹œ์ •์ง€ TIMED_WAITING ์ฃผ์–ด์ง„ ์‹œ๊ฐ„ ๋™์•ˆ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํƒœ
์ผ์‹œ์ •์ง€ BLOCKED ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด์˜ Lock์ด ํ’€๋ฆด ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํƒœ
์ข…๋ฃŒ TERMINATED ์“ฐ๋ ˆ๋“œ์˜ ์ž‘์—…์ด ์ข…๋ฃŒ๋œ ์ƒํƒœ
  • ์ œ์–ด

์“ฐ๋ ˆ๋“œ์˜ ์ œ์–ด

  • sleep()
    • Thread.sleep(ms); : ms(๋ฐ€๋ฆฌ์ดˆ)๋‹จ์œ„๋กœ ์„ค์ •๋จ
    • ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ•„์š” => sleep ์ƒํƒœ์— ์žˆ๋Š” ๋™์•ˆ interrupt()๋ฅผ ๋งŒ๋‚˜๋ฉด ๋‹ค์‹œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— InterruptException์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ
    • ํŠน์ • ์“ฐ๋ ˆ๋“œ๋ฅผ ์ง€๋ชฉํ•ด์„œ ๋ฉˆ์ถ”๊ฒŒํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅ
  • interrupt()
    • Thread ํด๋ž˜์Šค ๋‚ด๋ถ€์— interrupted ๋˜์—ˆ๋Š”์ง€๋ฅผ ์ฒดํฌํ•˜๋Š” boolean ๋ณ€์ˆ˜๊ฐ€ ์กด์žฌ
    • ์“ฐ๋ ˆ๋“œ๊ฐ€ start()๋œ ํ›„ ๋™์ž‘ํ•˜๋‹ค interrupt()๋ฅผ ๋งŒ๋‚˜ ์‹คํ–‰ํ•˜๋ฉด interrupted ์ƒํƒœ๊ฐ€ true๊ฐ€ ๋จ
    • isInterrupted() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒํƒœ๊ฐ’์„ ํ™•์ธ ๊ฐ€๋Šฅ
  • join()
    • ์ •ํ•ด์ง„ ์‹œ๊ฐ„๋™์•ˆ ์ง€์ •ํ•œ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆผ
    • ์‹œ๊ฐ„์„ ์ง€์ •ํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋Š” ์ง€์ •ํ•œ ์“ฐ๋ ˆ๋“œ์˜ ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ
  • yield()
    • ๋‚จ์€ ์‹œ๊ฐ„์„ ๋‹ค์Œ ์“ฐ๋ ˆ๋“œ์—๊ฒŒ ์–‘๋ณดํ•˜๊ณ  ์“ฐ๋ ˆ๋“œ ์ž์‹ ์€ ์‹คํ–‰๋Œ€๊ธฐ ์ƒํƒœ๊ฐ€ ๋จ
  • synchronized

๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ์˜ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ํ•œ ํ”„๋กœ์„ธ์Šค์˜ ์ž์›์„ ๊ณต์œ ํ•ด์„œ ์ž‘์—…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋กœ์—๊ฒŒ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Œ
์ด๋กœ ์ธํ•ด ์žฅ์• ๋‚˜ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ

  • ์ด๋Ÿฌํ•œ ์ผ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ•œ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ง„ํ–‰์ค‘์ธ ์ž‘์—…์„ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์นจ๋ฒ”ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ง‰๋Š” ๊ฒƒ์„ ์“ฐ๋ ˆ๋“œ ๋™๊ธฐํ™”(synchronized)๋ผ๊ณ  ํ•จ
  • ๋™๊ธฐํ™”๋ฅผ ํ•˜๋ ค๋ฉด ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ์˜ ์นจ๋ฒ”์„ ๋ง‰์•„์•ผํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž„๊ณ„์˜์—ญ์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋จ
  • ์ž„๊ณ„ ์˜์—ญ์—์„œ lock์„ ๊ฐ€์ง„ ๋‹จ ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๋งŒ ์ถœ์ž…์ด ๊ฐ€๋Šฅ => ์ฆ‰, ์ž„๊ณ„ ์˜์—ญ์€ ํ•œ ๋ฒˆ์— ํ•œ ์“ฐ๋ ˆ๋“œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • wait(), notify()
    • wait() : ์‹คํ–‰ ์ค‘์ด๋˜ ์“ฐ๋ ˆ๋“œ๋Š” ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋Œ€๊ธฐ์‹ค(waiting pool)์—์„œ ํ†ต์ง€๋ฅผ ๊ธฐ๋‹ค๋ฆผ
    • notify() : ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋Œ€๊ธฐ์‹ค(waiting pool)์— ์žˆ๋Š” ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ ์ค‘์—์„œ ์ž„์˜์˜ ์“ฐ๋ ˆ๋“œ๋งŒ ํ†ต์ง€๋ฅผ ๋ฐ›์Œ

์นจ๋ฒ”์„ ๋ง‰์€ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋‹ค๊ฐ€ ์ž‘์—…์„ ๋” ์ด์ƒ ์ง„ํ–‰ํ•  ์ƒํ™ฉ์ด ์•„๋‹ˆ๋ฉด, wait()์„ ํ˜ธ์ถœํ•˜์—ฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ lock์„ ๋ฐ˜๋‚ฉํ•˜๊ณ  ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Œ
- ๊ทธ๋Ÿผ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋ฝ์„ ์–ป์–ด ํ•ด๋‹น ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ ,
- ์ถ”ํ›„์— ์ž‘์—…์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด ๋˜๋ฉด `notify()`๋ฅผ ํ˜ธ์ถœํ•ด์„œ,
- ์ž‘์—…์„ ์ค‘๋‹จํ–ˆ๋˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋‹ค์‹œ lock์„ ์–ป์–ด ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ

  • Lock
    • synchronized ๋ธ”๋Ÿญ์œผ๋กœ ๋™๊ธฐํ™”ํ•˜๋ฉด ์ž๋™์ ์œผ๋กœ lock ๊ฑธ๋ฆฌ๊ณ  ํ’€๋ฆฌ์ง€๋งŒ, ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋‚ด์—์„œ๋งŒ lock์„ ๊ฑธ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ œ์•ฝ์ด ์žˆ์Œ
    • ์ด๋Ÿฐ ์ œ์•ฝ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด lock ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•จ
    • ReentrantLock
      • ์žฌ์ง„์ž… ๊ฐ€๋Šฅํ•œ lock, ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฐํƒ€ lock
      • ํŠน์ • ์กฐ๊ฑด์—์„œ lock์„ ๊ฑธ๊ณ , ๋‚˜์ค‘์— ๋‹ค์‹œ lock์„ ์–ป์–ด ์ž„๊ณ„์˜์—ญ์œผ๋กœ ์ง„์ž…์ด ๊ฐ€๋Šฅ
    public class MyClass { 
        private Object lock1 = new Object(); 
        private Object lock2 = new Object(); 
    
        public void methodA() { 
            synchronized (lock1) { 
                methodB(); 
            }
        } 
        public void methodB() { 
            synchronized (lock2) {
                // do something 
                methodA(); 
            }
        } 
    }
    
    -   methodA๋Š” lock1์„ ๊ฐ€์ง€๊ณ , methodB๋Š” lock2๋ฅผ ๊ฐ€์ง
    -   methodB์—์„œ methodA๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ, methodB์—์„œ lock2๋ฅผ ๊ฐ€์ง„ ์ƒํƒœ์—์„œ methodA๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด lock1์„ ๊ฐ€์ง€๋ ค๊ณ  ํ•  ๊ฒƒ
    -   ๊ทธ๋Ÿฌ๋‚˜ ์ด๋•Œ, methodA์—์„œ ์ด๋ฏธ lock1์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ lock2๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํƒœ๊ฐ€ ๋˜์–ด ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ
    -    ํ•˜์ง€๋งŒ, ReetrantLock์„ ์‚ฌ์šฉํ•˜๋ฉด, ๊ฐ™์€ ์Šค๋ ˆ๋“œ๊ฐ€ ์ด๋ฏธ ๋ฝ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋”๋ผ๋„ ๋ฝ์„ ์œ ์ง€ํ•˜๋ฉฐ ๊ณ„์† ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ
    -   ์ฆ‰, ReetrantLock์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ์œ ์—ฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Œ
    • ReetrantReadWriteLock
      • ์ฝ๊ธฐ๋ฅผ ์œ„ํ•œ lock๊ณผ ์“ฐ๊ธฐ๋ฅผ ์œ„ํ•œ lock์„ ๋”ฐ๋กœ ์ œ๊ณต
      • ์ฝ๊ธฐ์—๋Š” ๊ณต์œ ์ ์ด๊ณ , ์“ฐ๊ธฐ์—๋Š” ๋ฐฐํƒ€์ ์ธ Lock
      • ์ฝ๊ธฐ lock์ด ๊ฑธ๋ ค์žˆ์œผ๋ฉด ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋“ค๋„ ์ฝ๊ธฐ lock์„ ์ค‘๋ณต์œผ๋กœ ๊ฑธ๊ณ  ์ฝ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ(read-only)
      • ์ฝ๊ธฐ lock์ด ๊ฑธ๋ ค์žˆ๋Š” ์ƒํƒœ์—์„œ ์“ฐ๊ธฐ lock์„ ๊ฑฐ๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ(๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๋ฐฉ์ง€)
    • StampedLock
      • ReetrantReadWriteLock์— ๋‚™๊ด€์ ์ธ lock์˜ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•จ
        • ๋‚™๊ด€์ ์ธ lock : ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์ „์— lock์„ ๊ฑธ์ง€ ์•Š๋Š” ๊ฒƒ. ๋‚™๊ด€์ ์ธ ๋ฝ์€ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์„ ํ•  ๋•Œ ์ถฉ๋Œ์ด ์ผ์–ด๋‚  ๊ฐ€๋Šฅ์„ฑ์ด ์ ์€ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•จ
        • ๋‚™๊ด€์ ์ธ ๋ฝ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ ์ž‘์—… ๋ชจ๋‘๊ฐ€ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋จ. ์“ฐ๊ธฐ ์ž‘์—…์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋ฏธ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ ๋‹ค์‹œ ์ฝ๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ฝ์–ด๋“ค์ด๊ณ , ๋ณ€๊ฒฝ ์ž‘์—…์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•จ. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์“ฐ๊ธฐ ์ž‘์—…์ด ๋นˆ๋ฒˆํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ๋‚™๊ด€์ ์ธ ๋ฝ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋” ๋น ๋ฅธ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•จ
      • ๋‚™๊ด€์ ์ธ ์ฝ๊ธฐ lock์€ ์“ฐ๊ธฐ lock์— ์˜ํ•ด ๋ฐ”๋กœ ํ•ด์ œ ๊ฐ€๋Šฅํ•จ
      • ๋ฌด์กฐ๊ฑด ์ฝ๊ธฐ lock์„ ๊ฑธ์ง€ ์•Š๊ณ , ์“ฐ๊ธฐ์™€ ์ฝ๊ธฐ๊ฐ€ ์ถฉ๋Œํ•  ๋•Œ๋งŒ ์“ฐ๊ธฐ ํ›„ ์ฝ๊ธฐ lock์„ ๊ฒ€
  • Condition
    • wait() & notify() ๋Œ€์‹  Condition์˜ await() & signal()์„ ์‚ฌ์šฉํ•จ
  • wait() & notify() ์˜ ๋ฌธ์ œ์ ์ธ waiting pool ๋‚ด ์Šค๋ ˆ๋“œ๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ์ ์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ
728x90
๋ฐ˜์‘ํ˜•