TreadSafe

์“ฐ๋ ˆ๋“œ ์„ธ์ดํ”„ ํ•˜๋‹ค๋Š” ๊ฒƒ์€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋‚˜์š”?

  • ์“ฐ๋ ˆ๋“œ ์•ˆ์ „(Thread-Safety) ํ•˜๋‹ค๋Š” ๊ฒƒ์€ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์–ด๋–ค ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜, ํ˜น์€ ๊ฐ์ฒด๊ฐ€ ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ๋™์‹œ์— ์ ‘๊ทผ์ด ์ด๋ฃจ์–ด์ ธ๋„ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰์— ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

  • ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๊ฐ€ ํ•œ ์“ฐ๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ํ˜ธ์ถœ๋˜์–ด ์‹คํ–‰ ์ค‘์ผ ๋•Œ, ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๊ทธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋™์‹œ์— ํ•จ๊ป˜ ์‹คํ–‰๋˜๋”๋ผ๋„ ๊ฐ ์“ฐ๋ ˆ๋“œ์—์„œ์˜ ํ•จ์ˆ˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

์“ฐ๋ ˆ๋“œ ์•ˆ์ „ ์—ฌ๋ถ€ ํŒ๋‹จ ๋ฐฉ๋ฒ•

  • ์ „์—ญ ๋ณ€์ˆ˜๋‚˜ ํž™, ํŒŒ์ผ๊ณผ ๊ฐ™์ด ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ž์›์„ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

  • ํ•ธ๋“ค๊ณผ ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ์˜ ๊ฐ„์ ‘ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ๊ฐ€?

  • ๋ถ€์ˆ˜ ํšจ๊ณผ(Side Effect)๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š”๊ฐ€?

์“ฐ๋ ˆ๋“œ ์•ˆ์ „์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•œ 4๊ฐ€์ง€ ๋ฐฉ๋ฒ•

  • Mutual Exclusion (์ƒํ˜ธ ๋ฐฐ์ œ)

  • Atomic Operation (์›์ž ์—ฐ์‚ฐ)

  • Thread-Local Storage (์“ฐ๋ ˆ๋“œ ๋กœ์ปฌ ์ €์žฅ์†Œ)

  • Re-Entrancy(์žฌ์ง„์ž…์„ฑ)

Mutual Exclusion (์ƒํ˜ธ ๋ฐฐ์ œ)

  • ๊ณต์œ  ์ž์›์— ํ•˜๋‚˜์˜ Thread๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ธ๋งˆํฌ์–ด / ๋ฎคํ…์Šค๋กœ ๋ฝ์„ ํ†ต์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

Atomic Operation (์›์ž ์—ฐ์‚ฐ)

  • ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•  ๋•Œ๋Š” ์›์ž ์—ฐ์‚ฐ์„ ์ด์šฉํ•˜๊ฑฐ๋‚˜ ์›์ž์ ์œผ๋กœ ์ •์˜๋œ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ƒํ˜ธ ๋ฐฐ์ œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Atomic

    • ๊ณต์œ  ์ž์› ๋ณ€๊ฒฝ์— ํ•„์š”ํ•œ ์—ฐ์‚ฐ์„ ์›์ž์ ์œผ๋กœ ๋ถ„๋ฆฌํ•œ ๋’ค์— ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ์ด ์ด๋ฃจ์–ด์ง€๋Š” ์‹œ์ ์— Lock์„ ๊ฑธ๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์‹œ๊ฐ„ ๋™์•ˆ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ์˜ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

Thread-Local Storage (์“ฐ๋ ˆ๋“œ ๋กœ์ปฌ ์ €์žฅ์†Œ)

  • ๊ณต์œ  ์ž์›์˜ ์‚ฌ์šฉ์„ ์ตœ๋Œ€ํ•œ ์ค„์ด๊ณ  ๊ฐ๊ฐ์˜ ์“ฐ๋ ˆ๋“œ์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๋™์‹œ ์ ‘๊ทผ์„ ๋ง‰๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

  • ์ผ๋ฐ˜์ ์œผ๋กœ ๊ณต์œ  ์ƒํƒœ๋ฅผ ํ”ผํ•  ์ˆ˜ ์—†์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋ฉฐ, ์ „์—ญ ๋ณ€์ˆ˜ ์‚ฌ์šฉ์„ ์ž์ œํ•˜๋ผ๋Š” ๋œป์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

Re-entrancy (์žฌ์ง„์ž…์„ฑ)

  • ์“ฐ๋ ˆ๋“œ ํ˜ธ์ถœ๊ณผ ์ƒ๊ด€์—†์ด ํ”„๋กœ๊ทธ๋žจ์— ๋ฌธ์ œ๊ฐ€ ์—†๋„๋ก ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

  • ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ํ•œ ์“ฐ๋ ˆ๋“œ์— ์˜ํ•ด ํ˜ธ์ถœ๋˜์–ด ์‹คํ–‰ ์ค‘์ด๋ผ๋ฉด ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๊ทธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋”๋ผ๋„ ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ๊ฐ์—๊ฒŒ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฃผ์–ด์ ธ์•ผ ํ•œ๋‹ค.

  • ์“ฐ๋ ˆ๋“œ๋ผ๋ฆฌ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

Java์—์„œ Thread-Safe ํ•˜๊ฒŒ ์„ค๊ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•

  • java.util.concurrent ํŒจํ‚ค์ง€ ํ•˜์œ„์˜ ํด๋ž˜์Šค๋“ค์„ ์‚ฌ์šฉํ•œ๋‹ค.

  • ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ๋‘์ง€ ์•Š๋Š”๋‹ค.

  • ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ๋‹ค.

  • ๋™๊ธฐํ™”(Syncronized) ๋ธ”๋Ÿญ์—์„œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•œ ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค ๋งŒ๋“ค๊ธฐ

  • ๊ฒŒ์œผ๋ฅธ ์ดˆ๊ธฐํ™” (Synchronized ๋ธ”๋ก ์‚ฌ์šฉ)

    • ์†๋„๊ฐ€ ๋„ˆ๋ฌด ๋А๋ ค์„œ ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.

  • Double-Check Locking

    • if๋ฌธ์œผ๋กœ ์กด์žฌ ์—ฌ๋ถ€ ์ฒดํฌํ•˜๊ณ , Synchronized ๋ธ”๋ก ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

    • ์–ด๋А ์ •๋„ ๋ฌธ์ œ ํ•ด๊ฒฐ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์™„๋ฒฝํ•˜์ง€ ์•Š๋‹ค.

  • Holder์— ์˜ํ•œ ์ดˆ๊ธฐํ™”

    • ํด๋ž˜์Šค ์•ˆ์—์„œ ํด๋ž˜์Šค(Holder)๋ฅผ ๋‘์–ด JVM Class Loader ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•

    • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋™๊ธฐํ™” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ๋ณด๋‹ค๋Š” JVM์˜ ์›์ž์ ์ธ ํŠน์„ฑ์„ ์ด์šฉํ•ด ์ดˆ๊ธฐํ™”์˜ ์ฑ…์ž„์„ JVM์œผ๋กœ ์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•

    • ์ผ๋ฐ˜์ ์œผ๋กœ ์‹ฑ๊ธ€ํ†ค์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

Spring ์—์„œ๋Š” ์ด๋Ÿฐ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ํ†ตํ•ด Bean ์— ๋Œ€ํ•œ ๊ด€๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ๋ณต์žกํ•ด์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, Singleton Registry์ธ Application Context๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

java.util.concurrent ํŒจํ‚ค์ง€๋ž€?

  • Java 5 ์—์„œ ์ถ”๊ฐ€๋œ ํŒจํ‚ค์ง€๋กœ, ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋”ฉ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋“ค์„ ์ œ๊ณตํ•˜๋Š” ํŒจํ‚ค์ง€์ด๋‹ค.

    • Locks : ์ƒํ˜ธ ๋ฐฐ์ œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

    • Atomic : ๋™๊ธฐํ™”๊ฐ€ ๋˜์–ด์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

    • Executors : ์“ฐ๋ ˆ๋“œ ํ’€ ์ƒ์„ฑ, ์“ฐ๋ ˆ๋“œ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ, Task ๋“ฑ๋ก๊ณผ ์‹คํ–‰ ๋“ฑ์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

    • Queue : ์“ฐ๋ ˆ๋“œ ์•ˆ์ „ํ•œ ํ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

    • Synchronizers : ํŠน์ˆ˜ํ•œ ๋ชฉ์ ์˜ ๋™๊ธฐํ™”๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” 5๊ฐœ์˜ ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

      • Semaphore, CountDownLatch, CyclicBarrier, Phaser, Exchanger

์ฐธ๊ณ 

Last updated