2023. 1. 31. 10:23ใJAVA/Effective JAVA
item11. equals๋ฅผ ์ฌ์ ์ํ๋ ค๊ฑฐ๋ hashCode๋ ์ฌ์ ์ํ๋ผ.
" p71. ํด๋์ค๋ฅผ ์ค๋ ๋ ์์ ํ๊ฒ ๋ง๋ค๋๋ก ์ ๊ฒฝ ์จ์ผ ํ๋ค."
hashCode ๊ตฌํ ๋ฐฉ๋ฒ 3๋ฒ์งธ๋ก ์๊ฐํ ํด๋์ค๊ฐ ๋ถ๋ณ์ด๊ณ ํด์์ฝ๋๋ฅผ ๊ณ์ฐํ๋ ๋น์ฉ์ด ํฌ๋ค๋ฉด, ๋งค๋ฒ ์๋ก ๊ณ์ฐํ๊ธฐ๋ณด๋ค๋ ์บ์ฑํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๋๋ฐ ์ด๋ ํ๋๋ฅผ ์ง์ฐ ์ด๊ธฐํํ๋ ค๋ฉด ์ค๋ ๋ ์์ ํ๊ฒ ๋ง๋ค๋๋ก ์ ๊ฒฝ ์จ์ผ ํ๋ค๊ณ ํ๋ค.
์ค๋ ๋ ์์ Thread-Safety ๋?
: ๋ฉํฐ ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ์์ ์ผ๋ฐ์ ์ผ๋ก ์ด๋ค ํจ์๋ ๋ณ์, ํน์ ๊ฐ์ฒด๊ฐ ์ฌ๋ฌ ์ค๋ ๋๋ก๋ถํฐ ๋์์ ์ ๊ทผ์ด ์ด๋ฃจ์ด์ ธ๋ ํ๋ก๊ทธ๋จ์ ์คํ์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ ๋งํ๋ค.
์ฆ, ํ๋์ ํจ์๊ฐ ํ ์ค๋ ๋๋ก๋ถํฐ ํธ์ถ๋์ด ์คํ ์ค์ผ ๋, ๋ค๋ฅธ ์ค๋ ๋๊ฐ ๊ทธ ํจ์๋ฅผ ํธ์ถํ์ฌ ๋์์ ํจ๊ป ์คํ๋๋๋ผ๋ ๊ฐ ์ค๋ ๋์์์ ํจ์์ ์ํ ๊ฒฐ๊ณผ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ค๋ ๊ฒ์ ๋งํ๋ค.
@Override
public int hashCode()
{
int result = hashCode;
if (result == 0) {
result = Short.hashCode(areaCode);
result = 31 * result + Short.hashCode(prefix);
result = 31 * result + Short.hashCode(lineNum);
hashCode = result;
}
return result;
}
์ด ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ค๋ ๋ ์์ ํ ์ฝ๋์ฒ๋ผ ๋ณด์ด์ง๋ง ์ค๋ ๋ ์์ ํ ์ฝ๋๋ ์๋๋ค.
์ด๋ฅผ ์ค๋ ๋ ์์ ํ ์ฝ๋๋ก ๋ง๋ค๊ธฐ ์ํด์๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒใ ๋ ์ฌ๋ฌ ์ค๋ ๋ ๊ฐ ๊ณต์ ํ๋ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ๋์ง๋ง.. ๊ณต์ ํ๋ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด Synchronization์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
private volatile int hashCode;
// ๋ฉํฐ ์ค๋ ๋ ์์ ํ ๋ฐฉ๋ฒ
@Override
public int hashCode()
{
if (this.hashCode != 0) {
return hashCode;
}
synchronized (this) {
int result = hashCode;
if (result == 0) {
result = Short.hashCode(areaCode);
result = 31 * result + Short.hashCode(prefix);
result = 31 * result + Short.hashCode(lineNum);
hashCode = result;
}
return result;
}
}
์ค๋ ๋1์ด ์ง๊ธ synchronized์์ hashcode๋ฅผ ์์ฑ์ค์ด๋ผ๋ฉด ์ค๋ ๋2๋ ์ ๊ทผํ ์ ์๊ณ ๊ธฐ๋ค๋ ค์ผ ํ๋ค.
synchronized๋ ?
: ์๋ฐ์์ ๋ฐ์ดํฐ์ Thread-safe๋ฅผ ์ง์ํ๊ธฐ ์ํด synchronized ํค์๋๋ฅผ ์ ๊ณตํด ์ค๋ ๋ ๊ฐ ๋๊ธฐํ๋ฅผ ์์ผ ์ค๋ ๋ ์์ ์ ๊ฐ๋ฅํ๊ฒ ํด์ค๋ค.
์ด ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ์ค๋ ๋๊ฐ ํ ๊ฐ์ ์์์ ์ฌ์ฉํ๊ณ ์ ํ๋ค๋ฉด ์ด๋ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ์ค๋ ๋๋ฅผ ์ ์ธํ๊ณ ๋๋จธ์ง ์ค๋ ๋๋ค์ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์์๋๋ก ๋ง๋ ๊ฐ๋ ์ ๋งํ๋ค.
synchronized๋ก ์ค์ ๋ ์๊ณ์์ญ์ lock ๊ถํ์ ์ป์ ํ๋์ ๊ฐ์ฒด๋ง์ด ๋ ์ ์ ์ผ๋ก ์ฌ์ฉํ๊ฒ ๋๋ค.
(์ด ํค์๋๋ฅผ ๋๋ฌด ๋จ๋ฐํ๋ฉด ์ฑ๋ฅ ์ ํ๋ฅผ ์ผ์ผํฌ ์ ์๋ค.)
๐ ๊ทธ๋ฆฌ๊ณ Volatile ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณ์์ ๊ฐ์ read ํ ๋ main memory์์ ์ฝ์ด์์ ๋ง์ง๋ง ์ค๋ ๋๊ฐ ์ ์ฅํ ๊ฐ์ ๋ถ๋ฌ์ฌ ์ ์๋๋ก ํด์ค๋ค. ์ด ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ์ค๋ ๋๋ผ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๊ฐ์ ์ฝ์ด์ฌ ์ ์๋ค.
Syncrhonization์ ์ค๋ ๋ ์์ ํ๊ฒ ํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ก ๊ทธ ์ธ์ ๋ฐฉ๋ฒ์ผ๋ก๋
- ThreadLocal
- ๋ถ๋ณ ๊ฐ์ฒด ์ฌ์ฉ
- Synchronized ๋ฐ์ดํฐ ์ฌ์ฉ (ex. HashTable)
- Concurrent ๋ฐ์ดํฐ ์ฌ์ฉ
... ๋ฑ์ด ์๋ค.