Post

๐Ÿ“‘ JAVA 06 - Java Thread, synchronized, volatile, Atomic

๐Ÿ“‘ JAVA 06 - Java Thread, synchronized, volatile, Atomic

Java Thread, synchronized, volatile, Atomic

ํ•™์Šต ๋ชฉํ‘œ

์ด๋ฒˆ ์ฃผ์ œ์˜ ํ•ต์‹ฌ์€ ๋‹จ์ˆœํžˆ:

โ€œ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋Š” ๋™์‹œ์— ์‹คํ–‰๋œ๋‹คโ€

์ˆ˜์ค€์ด ์•„๋‹ˆ๋‹ค.

์‹ค๋ฌด์—์„œ๋Š” ๋ฐ˜๋“œ์‹œ ์•„๋ž˜๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

  • Race Condition์€ ์™œ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€?

  • synchronized๋Š” ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ๋ณด์žฅํ•˜๋Š”๊ฐ€?

  • volatile์€ ์™œ ํ•„์š”ํ•œ๊ฐ€?

  • Atomic์€ ์–ด๋–ป๊ฒŒ lock ์—†์ด ๋™์ž‘ํ•˜๋Š”๊ฐ€?

  • CAS๋Š” ์™œ ๋“ฑ์žฅํ–ˆ๋Š”๊ฐ€?

  • ThreadLocal์€ ์™œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์œ ๋ฐœํ•˜๋Š”๊ฐ€?

  • ์šด์˜ ํ™˜๊ฒฝ์—์„œ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋Š” ์–ด๋–ป๊ฒŒ ์žฅ์• ๊ฐ€ ๋˜๋Š”๊ฐ€?

์ฆ‰:

Java ๋™์‹œ์„ฑ ๋ชจ๋ธ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ€์‹œ์„ฑ ๋ฌธ์ œ

๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค.


๋จผ์ € ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐœ๋…

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์€:

โ€œ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์‹œ์— ์ ‘๊ทผโ€

ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.


Thread๋ž€?

Thread๋Š”:

ํ”„๋กœ์„ธ์Šค ๋‚ด๋ถ€ ์‹คํ–‰ ํ๋ฆ„

์ด๋‹ค.

์˜ˆ:

graph TD

    A[Process]

    A --> B[Thread 1]
    A --> C[Thread 2]
    A --> D[Thread 3]

์ค‘์š”ํ•œ ํŠน์ง•

Thread๋“ค์€:

  • Heap ๊ณต์œ 

  • Method Area ๊ณต์œ 

ํ•œ๋‹ค.

๋ฐ˜๋ฉด:

  • Stack์€ ๊ฐœ๋ณ„ ๋ณด์œ 

ํ•œ๋‹ค.


์™œ ์œ„ํ—˜ํ•œ๊ฐ€?

Heap์€ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋‹ค.

์ฆ‰:

graph TD

    A[Thread 1]
        --> D[Shared Heap]

    B[Thread 2]
        --> D

    C[Thread 3]
        --> D

๋™์‹œ์— ๊ฐ™์€ ๊ฐ์ฒด ์ ‘๊ทผ ๊ฐ€๋Šฅ.


Race Condition

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐœ๋….

Race Condition์€:

์‹คํ–‰ ์ˆœ์„œ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ๋ฌธ์ œ

๋‹ค.


์˜ˆ์‹œ

1
count++;

๊ฒ‰๋ณด๊ธฐ์—” 1์ค„์ด๋‹ค.

ํ•˜์ง€๋งŒ ์‹ค์ œ CPU ์ˆ˜์ค€์—์„œ๋Š”:

1
2
3
1. ๊ฐ’ ์ฝ๊ธฐ
2. +1 ์ˆ˜ํ–‰
3. ๋‹ค์‹œ ์ €์žฅ

3๋‹จ๊ณ„๋‹ค.


์™œ ๋ฌธ์ œ์ธ๊ฐ€?

์˜ˆ:

sequenceDiagram

    Thread1->>Memory: count ์ฝ๊ธฐ (0)
    Thread2->>Memory: count ์ฝ๊ธฐ (0)

    Thread1->>Memory: 1 ์ €์žฅ
    Thread2->>Memory: 1 ์ €์žฅ

๊ฒฐ๊ณผ:

1
2
์›๋ž˜ ๊ธฐ๋Œ€๊ฐ’ = 2
์‹ค์ œ ๊ฒฐ๊ณผ = 1

์ฆ‰:

๋ฐ์ดํ„ฐ ์œ ์‹ค

๋ฐœ์ƒ.


synchronized

Java ๊ธฐ๋ณธ ๋™๊ธฐํ™” ๋ฐฉ์‹.

1
2
3
public synchronized void increase() {
    count++;
}

synchronized ํ•ต์‹ฌ

ํ•ต์‹ฌ์€:

โ€œํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ Thread๋งŒ ์ ‘๊ทผโ€

์ด๋‹ค.


๋‚ด๋ถ€ ๋™์ž‘

graph TD

    A[Thread 1]
        --> D[Monitor Lock]

    B[Thread 2]
        --> D

    D --> E[Critical Section]

Monitor Lock์ด๋ž€?

Java ๊ฐ์ฒด ๋‚ด๋ถ€์—๋Š”:

1
Monitor

๋ผ๋Š” lock ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์กด์žฌ.

synchronized๋Š” ์ด Monitor ์‚ฌ์šฉ.


synchronized๊ฐ€ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ

1. Mutual Exclusion

๋™์‹œ ์ ‘๊ทผ ๋ฐฉ์ง€.


2. Memory Visibility

๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋ฉ”๋ชจ๋ฆฌ ๋™๊ธฐํ™”.

์ด๊ฒŒ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค.


synchronized ๋ฌธ์ œ์ 

1. Thread Blocking

lock ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ๋Œ€๊ธฐ.


2. Context Switching ๋น„์šฉ

CPU overhead ๋ฐœ์ƒ.


3. ์„ฑ๋Šฅ ์ €ํ•˜ ๊ฐ€๋Šฅ

๊ฒฝ์Ÿ ์‹ฌํ•˜๋ฉด throughput ๊ฐ์†Œ.


volatile

volatile์€ ๋งค์šฐ ์ž์ฃผ ์˜คํ•ด๋œ๋‹ค.


volatile ํ•ต์‹ฌ

volatile์€:

โ€œ๋ณ€์ˆ˜ ์ตœ์‹ ๊ฐ’ ๋ณด์žฅโ€

์ด๋‹ค.


์™œ ํ•„์š”ํ•œ๊ฐ€?

CPU๋Š” ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด:

  • CPU Cache

  • Register Cache

์‚ฌ์šฉํ•œ๋‹ค.


๋ฌธ์ œ ์ƒํ™ฉ

graph TD

    A[Main Memory]

    B[CPU Cache Thread1]
    C[CPU Cache Thread2]

    B --> A
    C --> A

Thread๋งˆ๋‹ค cache ๊ฐ’ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ.


์˜ˆ์‹œ

1
private boolean running = true;

Thread1:

1
2
while(running) {
}

Thread2:

1
running = false;

๋ฌธ์ œ

Thread1์ด CPU cache ๊ฐ’ ๊ณ„์† ๋ณผ ์ˆ˜ ์žˆ์Œ.

์ฆ‰:

1
๋ฌดํ•œ ๋ฃจํ”„ ๊ฐ€๋Šฅ

volatile ์‚ฌ์šฉ

1
private volatile boolean running;

volatile์ด ๋ณด์žฅํ•˜๋Š” ๊ฒƒ

1. Memory Visibility

์ตœ์‹ ๊ฐ’ ์ฝ๊ธฐ ๋ณด์žฅ.


volatile์ด ๋ณด์žฅํ•˜์ง€ ์•Š๋Š” ๊ฒƒ

Atomicity

์ด๊ฑฐ ์—„์ฒญ ์ค‘์š”ํ•˜๋‹ค.


์ฆ‰ ์ด๊ฑด ์œ„ํ—˜ํ•˜๋‹ค

1
2
3
volatile int count;

count++;

์—ฌ์ „ํžˆ race condition ๊ฐ€๋Šฅ.

์™œ๋ƒ๋ฉด:

1
read โ†’ modify โ†’ write

๋Š” atomicํ•˜์ง€ ์•Š๋‹ค.


Atomic ํด๋ž˜์Šค

๋Œ€ํ‘œ:

1
2
3
AtomicInteger
AtomicLong
AtomicReference

ํ•ต์‹ฌ ์ฒ ํ•™

lock ์—†์ด ์›์ž์  ์—ฐ์‚ฐ ์ˆ˜ํ–‰

์ด๋‹ค.


CAS(Compare And Swap)

Atomic ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜.


CAS ๋™์ž‘ ํ๋ฆ„

graph TD

    A[ํ˜„์žฌ ๊ฐ’ ์ฝ๊ธฐ]
        --> B{์˜ˆ์ƒ๊ฐ’๊ณผ ๋™์ผ?}

    B -->|YES| C[๊ฐ’ ๋ณ€๊ฒฝ]
    B -->|NO| D[์žฌ์‹œ๋„]

์˜ˆ์‹œ

1
2
3
4
AtomicInteger count =
    new AtomicInteger();

count.incrementAndGet();

์™œ ๋น ๋ฅธ๊ฐ€?

๊ธฐ์กด synchronized:

1
Thread Blocking

๋ฐœ์ƒ.

CAS๋Š”:

lock-free ๋ฐฉ์‹

๊ฐ€๋Šฅ.


CAS ๋ฌธ์ œ์ 

1. Spin ๋ฌธ์ œ

์‹คํŒจ ์‹œ ๊ณ„์† ์žฌ์‹œ๋„.

CPU ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€ ๊ฐ€๋Šฅ.


2. ABA ๋ฌธ์ œ

1
A โ†’ B โ†’ A

๋ณ€๊ฒฝ๋ผ๋„ ๊ฐ์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Œ.


synchronized vs Atomic

synchronized

์žฅ์ :

  • ๊ตฌํ˜„ ๋‹จ์ˆœ

  • ๋ณต์žกํ•œ ๋™๊ธฐํ™” ๊ฐ€๋Šฅ

๋‹จ์ :

  • blocking ๋ฐœ์ƒ

Atomic

์žฅ์ :

  • ๋น ๋ฆ„

  • lock-free

๋‹จ์ :

  • ๋ณต์žกํ•œ ์—ฐ์‚ฐ ํ•œ๊ณ„

ThreadLocal

์‹ค๋ฌด์—์„œ ์—„์ฒญ ์ค‘์š”ํ•˜๋‹ค.


ThreadLocal ํ•ต์‹ฌ

Thread๋งˆ๋‹ค ๋…๋ฆฝ ๋ณ€์ˆ˜ ์ œ๊ณต

์ด๋‹ค.


์˜ˆ์‹œ

1
2
ThreadLocal<User> local =
    new ThreadLocal<>();

์™œ ์“ฐ๋Š”๊ฐ€?

๋Œ€ํ‘œ:

  • ์‚ฌ์šฉ์ž ์ •๋ณด

  • Transaction Context

  • ๋กœ๊ทธ ์ถ”์ 

  • ์ธ์ฆ ์ •๋ณด


Spring์—์„œ๋„ ๋งŽ์ด ์‚ฌ์šฉ

๋Œ€ํ‘œ:

  • SecurityContextHolder

  • TransactionSynchronizationManager


ThreadLocal ๊ตฌ์กฐ

graph TD

    A[Thread 1]
        --> B[ThreadLocalMap]

    C[Thread 2]
        --> D[ThreadLocalMap]

์™œ Memory Leak ๋ฐœ์ƒํ•˜๋‚˜?

ํ•ต์‹ฌ:

Thread Pool ๋•Œ๋ฌธ

์ด๋‹ค.


๋ฌธ์ œ ์ƒํ™ฉ

Thread Pool Thread๋Š”:

1
์ฃฝ์ง€ ์•Š๊ณ  ์žฌ์‚ฌ์šฉ

๋œ๋‹ค.


๊ทธ๋Ÿฐ๋ฐ remove ์•ˆ ํ•˜๋ฉด?

1
threadLocal.set(user);

๋งŒ ํ•˜๊ณ :

1
remove()

์•ˆ ํ•˜๋ฉด ๊ฐ’ ๊ณ„์† ๋‚จ๋Š”๋‹ค.


๊ฒฐ๊ณผ

graph TD

    A[Thread Pool Thread]
        --> B[ThreadLocalMap]

    B --> C[User Object]

๊ฐ์ฒด GC ์•ˆ ๋จ.


์‹ค์ œ ์šด์˜ ์žฅ์•  ์‚ฌ๋ก€

1
2
3
Heap ์ฆ๊ฐ€
โ†’ Full GC ์ฆ๊ฐ€
โ†’ OOM ๋ฐœ์ƒ

ํŠนํžˆ:

  • Tomcat

  • Spring MVC

  • Async ์ฒ˜๋ฆฌ

ํ™˜๊ฒฝ์—์„œ ํ”ํ•˜๋‹ค.


์‹ค๋ฌด์—์„œ ์ค‘์š”ํ•œ ๋™์‹œ์„ฑ ๋ฌธ์ œ

๋Œ€ํ‘œ ์‚ฌ๋ก€:

  • ์ฃผ๋ฌธ ์ค‘๋ณต ์ƒ์„ฑ

  • ์žฌ๊ณ  ์Œ์ˆ˜

  • ์ค‘๋ณต ๊ฒฐ์ œ

  • ์บ์‹œ ์˜ค์—ผ


์‹ค์ „ ์˜ˆ์‹œ

1
2
3
4
์žฌ๊ณ  1๊ฐœ

Thread1 ๊ตฌ๋งค
Thread2 ๊ตฌ๋งค

๋‘˜ ๋‹ค ์„ฑ๊ณต ๊ฐ€๋Šฅ.


์™œ ์–ด๋ ค์šด๊ฐ€?

๋™์‹œ์„ฑ ๋ฌธ์ œ๋Š”:

โ€œ๊ฐ€๋”๋งŒ ๋ฐœ์ƒโ€

ํ•œ๋‹ค.

์ฆ‰:

  • ์žฌํ˜„ ์–ด๋ ค์›€

  • ํ…Œ์ŠคํŠธ ์–ด๋ ค์›€

  • ์šด์˜์—์„œ๋งŒ ํ„ฐ์ง

๋งค์šฐ ์œ„ํ—˜ํ•˜๋‹ค.


์„ฑ๋Šฅ ๊ด€์ 

๋™๊ธฐํ™”๋Š” ํ•ญ์ƒ Trade-off ์กด์žฌ.


lock ๋งŽ์ด ์‚ฌ์šฉ

์žฅ์ :

  • ์•ˆ์ „์„ฑ ์ฆ๊ฐ€

๋‹จ์ :

  • throughput ๊ฐ์†Œ

lock ์ค„์ด๋ฉด

์žฅ์ :

  • ์„ฑ๋Šฅ ํ–ฅ์ƒ

๋‹จ์ :

  • race condition ์œ„ํ—˜

์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์‹ค์ˆ˜

1. volatile์ด๋ฉด ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ฐฉ๊ฐ

Atomicity ๋ณด์žฅ ์•ˆ ํ•จ.


2. HashMap ๋ฉ€ํ‹ฐ Thread ์‚ฌ์šฉ

์‹ค๋ฌด ์žฅ์•  ํ”ํ•จ.


3. ThreadLocal remove ๋ˆ„๋ฝ

๋ฉ”๋ชจ๋ฆฌ leak ๋ฐœ์ƒ.


4. synchronized ๋‚จ์šฉ

์„ฑ๋Šฅ ๋ณ‘๋ชฉ ๊ฐ€๋Šฅ.


๋ฉด์ ‘ ๊ผฌ๋ฆฌ ์งˆ๋ฌธ

Q1. synchronized๋Š” ๋ฌด์—‡์„ ๋ณด์žฅํ•˜๋‚˜์š”?

ํ•ต์‹ฌ:

  • mutual exclusion

  • visibility


Q2. volatile์€ ์™œ ํ•„์š”ํ•œ๊ฐ€์š”?

ํ•ต์‹ฌ:

  • CPU cache visibility ๋ฌธ์ œ ํ•ด๊ฒฐ

Q3. volatile์ด atomicity๋ฅผ ๋ณด์žฅํ•˜๋‚˜์š”?

์ •๋‹ต:

  • ์•„๋‹ˆ๋‹ค

Q4. CAS๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

ํ•ต์‹ฌ:

  • lock-free atomic operation

Q5. ThreadLocal leak์€ ์™œ ๋ฐœ์ƒํ•˜๋‚˜์š”?

ํ•ต์‹ฌ:

  • Thread Pool ์žฌ์‚ฌ์šฉ

  • remove ๋ˆ„๋ฝ


์ข‹์€ ๋‹ต๋ณ€ ์˜ˆ์‹œ

Java Thread๋Š” Heap ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Race Condition ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
synchronized๋Š” Monitor Lock์„ ํ†ตํ•ด mutual exclusion๊ณผ memory visibility๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
volatile์€ ์ตœ์‹ ๊ฐ’ visibility๋งŒ ๋ณด์žฅํ•˜๋ฉฐ atomicity๋Š” ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
Atomic ํด๋ž˜์Šค๋Š” CAS ๊ธฐ๋ฐ˜ lock-free ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ ThreadLocal์€ Thread Pool ํ™˜๊ฒฝ์—์„œ remove ๋ˆ„๋ฝ ์‹œ ๋ฉ”๋ชจ๋ฆฌ leak์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๊ด€๋ จ CS ๊ฐœ๋… ์—ฐ๊ฒฐ

  • Race Condition

  • Memory Visibility

  • Mutual Exclusion

  • Compare-And-Swap

  • Lock-Free Algorithm

  • CPU Cache

  • Context Switching


ํ˜„์—…์—์„œ ํŠนํžˆ ์ค‘์š”ํ•œ ํฌ์ธํŠธ

1. ๋™์‹œ์„ฑ ๋ฌธ์ œ๋Š” ์šด์˜์—์„œ ํ„ฐ์ง„๋‹ค

์žฌํ˜„ ์–ด๋ ค์›€.


2. volatile ์˜คํ•ด ๋งค์šฐ ๋งŽ๋‹ค

visibility๋งŒ ๋ณด์žฅ.


3. ThreadLocal leak ๋งค์šฐ ํ”ํ•˜๋‹ค

์‹ค๋ฌด ๋‹จ๊ณจ ์žฅ์• .


4. synchronized vs CAS Trade-off ์ค‘์š”

์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ ๊ท ํ˜• ํ•„์š”.


ํ•ต์‹ฌ ์š”์•ฝ

  • Thread๋Š” Heap ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•œ๋‹ค

  • Race Condition์€ ์‹คํ–‰ ์ˆœ์„œ ๋ฌธ์ œ๋‹ค

  • synchronized๋Š” lock ๊ธฐ๋ฐ˜ ๋™๊ธฐํ™”๋‹ค

  • volatile์€ visibility๋งŒ ๋ณด์žฅํ•œ๋‹ค

  • Atomic์€ CAS ๊ธฐ๋ฐ˜ lock-free ๋ฐฉ์‹์ด๋‹ค

  • ThreadLocal์€ Thread Pool ํ™˜๊ฒฝ์—์„œ leak ์œ„ํ—˜์ด ์žˆ๋‹ค

  • ๋™์‹œ์„ฑ ๋ฌธ์ œ๋Š” ์‹ค์ œ ์šด์˜ ์žฅ์• ์™€ ๋งค์šฐ ๋ฐ€์ ‘ํ•˜๋‹ค

This post is licensed under CC BY 4.0 by the author.