Coding Planet

HashMap / HashTable / ConCurrentHashMap ํ•œ๋ฒˆ์— ์ •๋ฆฌํ•˜๊ธฐ ๋ณธ๋ฌธ

๐Ÿ’ป Java Study/Java ์ด๋ก  ์ •๋ฆฌ

HashMap / HashTable / ConCurrentHashMap ํ•œ๋ฒˆ์— ์ •๋ฆฌํ•˜๊ธฐ

jhj.sharon 2024. 2. 29. 14:41
๋ฐ˜์‘ํ˜•
HashMap / HashTable / ConCurrentHashMap์€ Java์˜ Map ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด์ด๋‹ค.

 

 

| HashMap / HashTable / ConCurrentHashMap ๋น„๊ตํ•˜๊ธฐ

ํŠน์ง•/๊ตฌํ˜„์ฒด HashMap Hashtable ConcurrentHashMap
๋™๊ธฐํ™”
(Synchronization)
๋™๊ธฐํ™”๋˜์ง€ ์•Š์Œ ๋™๊ธฐํ™”๋จ ๋ถ€๋ถ„ ๋™๊ธฐํ™”(์„ธ๊ทธ๋จผํŠธ ๋ฝ)
Null ํ—ˆ์šฉ ํ‚ค์™€ ๊ฐ’ ๋ชจ๋‘์— null ํ—ˆ์šฉ null ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ null ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ
์„ฑ๋Šฅ ๋น ๋ฆ„ ๋Š๋ฆผ HashMap๋ณด๋‹ค ๋Š๋ฆฌ์ง€๋งŒ,
Hashtable๋ณด๋‹ค๋Š” ๋น ๋ฆ„
Iterator fail-fast fail-safe๊ฐ€ ์•„๋‹˜ fail-safe
๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ ์ ํ•ฉํ•˜์ง€ ์•Š์Œ(๋™๊ธฐํ™” ์ถ”๊ฐ€ ํ•„์š”) ์ ํ•ฉํ•˜์ง€๋งŒ ์„ฑ๋Šฅ ์ €ํ•˜ ์ ํ•ฉํ•˜๋ฉฐ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋จ
์šฉ๋„ ๋‹จ์ผ ์Šค๋ ˆ๋“œ ๋˜๋Š” ๋™๊ธฐํ™” ์™ธ๋ถ€์—์„œ ๊ด€๋ฆฌ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ, ๋‹จ์ผ ์Šค๋ ˆ๋“œ
๋˜๋Š” ์™„์ „ํ•œ ๋ฉ”์†Œ๋“œ ๋™๊ธฐํ™”๊ฐ€
ํ•„์š”ํ•œ ๊ฒฝ์šฐ
๊ณ ์„ฑ๋Šฅ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ

 

 

  • HashMap: ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” Map ๊ตฌํ˜„์ฒด๋กœ, ํ‚ค-๊ฐ’ ์Œ์„ ์ €์žฅํ•œ๋‹ค. ๋™๊ธฐํ™”๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์•„ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์ง€๋งŒ ๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
  • Hashtable: HashMap๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ, ๋ชจ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ ๋™๊ธฐํ™”๋˜์–ด ์žˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ์— ๋”ฐ๋ฅธ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์žˆ๋‹ค. ๋˜ํ•œ, Hashtable์€ null ๊ฐ’์„ ํ‚ค๋‚˜ ๊ฐ’์œผ๋กœ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ConcurrentHashMap: ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ์˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ Map ๊ตฌํ˜„์ฒด์ด๋‹ค. ์ „์ฒด ๋งต์„ ์ž ๊ทธ์ง€ ์•Š๊ณ ๋„ ๋™์‹œ์„ฑ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์„ธ๋ถ„ํ™”๋œ ๋ฝ(์„ธ๊ทธ๋จผํŠธ ๋ฝ) ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋†’์€ ๋™์‹œ์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ์˜ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•œ๋‹ค.

 

| ๊ทธ๋Ÿผ  HashTable๊ณผ  ์™œ ์“ฐ๋ƒ? เฒ  ษž เฒ  -> ConCurrentHashMap ์จ๋ผ

์œ„ ํ…Œ์ด๋ธ”์—์„œ ๋น„๊ตํ•  ๋•Œ ์•ฝ๊ฐ„์˜ ์„ฑ๋Šฅ์ฐจ์ด๋ฅผ ๋นผ๊ณ ๋Š” ๊ตณ์ด HashTable์„ ์“ธ ์ด์œ ๊ฐ€ ์—†๋‹ค.  ํ•˜์ง€๋งŒ ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  HashTable์ด ๋จผ์ € ๋“ฑ์žฅํ•˜๊ณ  ์ดํ›„์— ConcurrentHashMap๊ฐ€ ๋Œ€์•ˆ์œผ๋กœ ๋‚˜์™”๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ HashTable์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

HashTable์€ Java ์ดˆ๊ธฐ ๋ฒ„์ „๋ถ€ํ„ฐ ์ œ๊ณต๋˜์–ด ์˜จ thread-safeํ•œ Map ๊ตฌํ˜„์ฒด์ด๋‹ค. HashTable์˜ ๋ชจ๋“  ๊ณต๊ฐœ ๋ฉ”์„œ๋“œ๋Š” 'synchronized'ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™๊ธฐํ™”๋œ๋‹ค(์ „์ฒด ๋ ˆ๋ฒจ์—์„œ lock). ์ด๋กœ ์ธํ•ด ํ•œ ์‹œ์ ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ์ด ๋งต์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. 

 

๋ชจ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ ๋™๊ธฐํ™”๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค์ˆ˜์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ๋งต์— ์ ‘๊ทผํ•  ๊ฒฝ์šฐ ์„ฑ๋Šฅ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ๋งต์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋Š” ๋Œ€๊ธฐ์ƒํƒœ๊ฐ€ ๋˜์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๋”ฐ๋ผ์„œ HashTable์€ ๋” ์ด์ƒ ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค. Java 1.5๋ถ€ํ„ฐ๋Š” ๋™์‹œ์„ฑ์„ ์œ„ํ•ด ConcurrentHashMap์ด ๋„์ž…๋˜์—ˆ๊ณ  HashTable์€ ๋ ˆ๊ฑฐ์‹œ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค.

 

์ด๋Ÿฌํ•œ ๋งฅ๋ฝ์—์„œ ConcurrentHashMap์€ ๋ถ€๋ถ„ ๋ฝ( (Fine-grained Locking) (Fine-grained Locking)์„ ์ œ๊ณตํ•œ๋‹ค. ConcurrentHashMap๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์„ธ๊ทธ๋จผํŠธ๋“ค๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ๋Š”๋ฐ ๊ฐ ์„ธ๊ทธ๋จผํŠธ๋Š” ๋ณ„๋„๋กœ ๋ฝ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ๋งต์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์–ด HashTable์— ๋น„ํ•ด ํ›จ์”ฌ ๋†’์€ ๋™์‹œ์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

 

 

๊ฒฝ์Ÿ์กฐ๊ฑด๊ณผ ๋™๊ธฐํ™”๋ฉ”์ปค๋‹ˆ์ฆ˜(Lock)์ด ๊ถ๊ธˆํ•˜๋‹ค๋ฉด ์•„๋ž˜ ํฌ์ŠคํŠธ ์ฐธ๊ณ !

https://sharonprogress.tistory.com/328

๋ฐ˜์‘ํ˜•
Comments