์๋
! ์ค๋ ์ฐ๋ฆฌ๋ ๊ณ์ํด์ ๋ค์ค ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ์ ๊ธฐ๋ฅ์ ๊ณ ๋ คํ๊ณ ์ค๋ ๋ ๋๊ธฐํ์ ๋ํด ์ด์ผ๊ธฐํ ๊ฒ์
๋๋ค.
Java์์ ๋๊ธฐํ๋ ๋ฌด์์ ๋๊น?
ํ๋ก๊ทธ๋๋ฐ ์์ญ ๋ฐ์์๋ ๋ ๊ฐ์ ์ฅ์น ๋๋ ํ๋ก๊ทธ๋จ์ด ํจ๊ป ์๋ํ๋๋ก ํ์ฉํ๋ ๋ฐฐ์ด์ ์๋ฏธํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ค๋งํธํฐ๊ณผ ์ปดํจํฐ๋ฅผ Google ๊ณ์ ๊ณผ ๋๊ธฐํํ ์ ์๊ณ , ์น์ฌ์ดํธ ๊ณ์ ์ ์์ ๋คํธ์ํฌ ๊ณ์ ๊ณผ ๋๊ธฐํํ์ฌ ๋ก๊ทธ์ธํ ์ ์์ต๋๋ค. ์ค๋ ๋ ๋๊ธฐํ๋ ์ ์ฌํ ์๋ฏธ๋ฅผ ๊ฐ์ง๋๋ค. ์๋ก. ์ด์ ํ์ต์์๋ ์ค๋ ๋๊ฐ ์๋ก ๋ณ๋๋ก ์๋ํ์ต๋๋ค. ํ๋๋ ๊ณ์ฐ์ ์ํํ๊ณ , ๋ ๋ฒ์งธ๋ ์ ์ ์ค๊ณ , ์ธ ๋ฒ์งธ๋ ์ฝ์์ ๋ฌด์ธ๊ฐ๋ฅผ ํ์ํ์ง๋ง ์ํธ ์์ฉํ์ง ์์์ต๋๋ค. ์ค์ ํ๋ก๊ทธ๋จ์์๋ ์ด๋ฌํ ์ํฉ์ด ๊ฑฐ์ ๋ฐ์ํ์ง ์์ต๋๋ค. ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์ผํ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์์ ํ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ํ ์คํธ ํ์ผ์ด๋ ์ฝ์๊ณผ ๊ฐ์ ๋์ผํ ์์น์ ํ ์คํธ๋ฅผ ์ฐ๋ ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ์์ํด ๋ณด์ญ์์ค. ์ด ๊ฒฝ์ฐ ํ์ผ ๋๋ ์ฝ์์ ๊ณต์ ๋ฆฌ์์ค๊ฐ ๋ฉ๋๋ค. ์ค๋ ๋๋ ์๋ก์ ์กด์ฌ๋ฅผ ์์ง ๋ชปํ๋ฏ๋ก ์ค๋ ๋ ์ค์ผ์ค๋ฌ๊ฐ ํ ๋นํ ์๊ฐ ๋ด์ ๊ฐ๋ฅํ ๋ชจ๋ ๊ฒ์ ์์ฑํฉ๋๋ค. ์ต๊ทผ ์์ ์์ ์ฐ๋ฆฌ๋ ์ด๊ฒ์ด ์ด๋๋ก ์ด์ด์ง๋์ง์ ๋ํ ์๋ฅผ ๋ณด์์ต๋๋ค. ์ง๊ธ ๊ธฐ์ตํด ๋ด ์๋ค. ๊ทธ ์ด์ ๋ ์ค๋ ๋๊ฐ ์๋ก ์์ ์ ์กฐ์ ํ์ง ์๊ณ ๊ณต์ ๋ฆฌ์์ค(์ฝ์)์ ํจ๊ป ์์ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ค๋ ๋ ์ค์ผ์ค๋ฌ๊ฐ Thread-1์ ์๊ฐ์ ํ ๋นํ๋ฉด ์ฆ์ ๋ชจ๋ ๊ฒ์ ์ฝ์์ ๊ธฐ๋กํฉ๋๋ค. ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ด๋ฏธ ์์ฑํ๊ฑฐ๋ ์์ง ์์ฑํ์ง ์์ ๊ฒ์ ์ค์ํ์ง ์์ต๋๋ค. ๋ณด์๋ค์ํผ ๊ฒฐ๊ณผ๋ ์ฐ์ธํฉ๋๋ค. ๊ทธ๋์ ๋ฉํฐ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ์ ๋ฎคํ ์ค(์ํธ ๋ฐฐ์ ) ๋ผ๋ ํน๋ณํ ๊ฐ๋ ์ ๋์ ํ์ต๋๋ค. ๋ฎคํ ์ค์ ๋ชฉ์ ํน์ ์๊ฐ์ ํ๋์ ์ค๋ ๋๋ง ๊ฐ์ฒด์ ์ก์ธ์คํ ์ ์๋๋ก ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค. Thread-1์ด ๊ฐ์ฒด A์ ๋ฎคํ ์ค๋ฅผ ํ๋ํ๋ฉด ๋ค๋ฅธ ์ค๋ ๋๋ ๊ฐ์ฒด์ ์ก์ธ์คํ๊ณ ์์ ํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ค๋ ๋๋ ๊ฐ์ฒด A์ ๋ฎคํ ์ค๊ฐ ํด์ ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค. ๋ค์์ ์ถ์ ์์ ๋๋ค. ๊ทํ์ ๋ค๋ฅธ 10๋ช ์ ๋ฏ์ ์ฌ๋๋ค์ด ์ด๋์ ์ฐธ์ฌํ๊ณ ์๋ค๊ณ ์์ํด ๋ณด์ญ์์ค. ๋ฒ๊ฐ์ ๊ฐ๋ฉฐ ์์ด๋์ด๋ฅผ ํํํ๊ณ ๋ฌด์ธ๊ฐ๋ฅผ ๋ ผ์ํด์ผ ํฉ๋๋ค. ํ์ง๋ง ์๋ก ์ฒ์ ๋ณด๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋์์์ด ์๋ก๋ฅผ ๋ฐฉํดํ๊ณ ํ๋ฅผ ๋ด์ง ์๊ธฐ ์ํด '๋งํ๋ ๊ณต'์ ์ฌ์ฉํฉ๋๋ค. ๊ณต์ ๊ฐ์ง ์ฌ๋๋ง ๋ง์ ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํ๋ฅญํ๊ณ ์ ์ตํ ํ ๋ก ์ ๋๋ผ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๊ณต์ ๋ฎคํ ์ค์ ๋๋ค. ๊ฐ์ฒด์ ๋ฎคํ ์ค๊ฐ ํ ์ค๋ ๋์ ์์ ์๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ค๋ ๋๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.Object
์ด๋ Java์ ๋ชจ๋ ๊ฐ์ฒด์ ํ๋์ฉ ์์์ ์๋ฏธํฉ๋๋ค.
๋๊ธฐํ ์ฐ์ฐ์ ์๋ ๋ฐฉ์
์ ํค์๋์ธ synchronized ์ ๋ํด ์์๋ด ์๋ค . ํน์ ์ฝ๋ ๋ธ๋ก์ ํ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฝ๋ ๋ธ๋ก์synchronized
ํค์๋๊ฐ ํ์๋ ๊ฒฝ์ฐ ํด๋น ๋ธ๋ก์ ํ ๋ฒ์ ํ๋์ ์ค๋ ๋์์๋ง ์คํํ ์ ์์ต๋๋ค. ๋๊ธฐํ๋ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ ์ฒด ๋ฉ์๋๋ฅผ ๋๊ธฐํํ๋๋ก ์ ์ธํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
public synchronized void doSomething() {
// ...Method logic
}
๋๋ ์ผ๋ถ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋๊ธฐํ๊ฐ ์ํ๋๋ ์ฝ๋ ๋ธ๋ก์ ์์ฑํฉ๋๋ค.
public class Main {
private Object obj = new Object();
public void doSomething() {
// ...Some logic available simultaneously to all threads
synchronized (obj) {
// Logic available to just one thread at a time
}
}
}
์๋ฏธ๋ ๊ฐ๋จํฉ๋๋ค. ํ๋์ ์ค๋ ๋๊ฐ ํค์๋๋ก ํ์๋ ์ฝ๋ ๋ธ๋ก ๋ด๋ถ๋ก ๋ค์ด๊ฐ๋ฉด synchronized
์ฆ์ ๊ฐ์ฒด์ ๋ฎคํ
์ค๋ฅผ ์บก์ฒํ๊ณ ๋์ผํ ๋ธ๋ก์ด๋ ๋ฉ์๋์ ๋ค์ด๊ฐ๋ ค๋ ๋ค๋ฅธ ๋ชจ๋ ์ค๋ ๋๋ ์ด์ ์ค๋ ๋๊ฐ ์์
์ ์๋ฃํ๊ณ ๋ชจ๋ํฐ๋ฅผ ํด์ ํ ๋๊น์ง ๊ฐ์ ๋ก ๋๊ธฐํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ! ๊ณผ์ ์ค์ ์ด๋ฏธ ์ ์๋ฅผ ๋ณด์์ง๋ง synchronized
๋ค๋ฅด๊ฒ ๋ณด์์ต๋๋ค.
public void swap()
{
synchronized (this)
{
// ...Method logic
}
}
์ฃผ์ ๋ ๋น์ ์๊ฒ ์๋ก์ด ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฌผ๋ก ๊ตฌ๋ฌธ์ ํผ๋์ด ์์ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ๋์ค์ ๋ค๋ฅธ ์์ฑ ๋ฐฉ๋ฒ์ผ๋ก ํผ๋๋์ง ์๋๋ก ์ฆ์ ์๊ธฐํ์ญ์์ค. ์ด ๋ ๊ฐ์ง ์์ฑ ๋ฐฉ๋ฒ์ ๊ฐ์ ์๋ฏธ์
๋๋ค.
public void swap() {
synchronized (this)
{
// ...Method logic
}
}
public synchronized void swap() {
}
}
์ฒซ ๋ฒ์งธ ๊ฒฝ์ฐ ๋ฉ์๋๋ฅผ ์
๋ ฅํ๋ ์ฆ์ ๋๊ธฐํ๋ ์ฝ๋ ๋ธ๋ก์ ๋ง๋ญ๋๋ค. this
๊ฐ์ฒด, ์ฆ ํ์ฌ ๊ฐ์ฒด ์ ์ํด ๋๊ธฐํ๋ฉ๋๋ค . ๋ ๋ฒ์งธ ์์์๋ synchronized
ํค์๋๋ฅผ ์ ์ฒด ๋ฉ์๋์ ์ ์ฉํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋๊ธฐํ์ ์ฌ์ฉ๋๋ ๊ฐ์ฒด๋ฅผ ๋ช
์์ ์ผ๋ก ํ์ํ ํ์๊ฐ ์์ต๋๋ค. ์ ์ฒด ๋ฉ์๋๊ฐ ํค์๋๋ก ํ์๋๊ธฐ ๋๋ฌธ์ ๋ฉ์๋๋ ํด๋์ค์ ๋ชจ๋ ์ธ์คํด์ค์ ๋ํด ์๋์ผ๋ก ๋๊ธฐํ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ค ๋ฐฉ๋ฒ์ด ๋ ๋์์ง์ ๋ํ ๋
ผ์์ ๋ฐ์ด๋ค์ง ์์ ๊ฒ์
๋๋ค. ์ง๊ธ์ ๊ฐ์ฅ ๋ง์์ ๋๋ ๋ฐฉ๋ฒ์ ์ ํํ์ธ์ :) ๊ฐ์ฅ ์ค์ํ ์ ์ ๋ชจ๋ ๋
ผ๋ฆฌ๊ฐ ํ ๋ฒ์ ํ๋์ ์ค๋ ๋์ ์ํด ์คํ๋ ๋๋ง ๋๊ธฐํ๋ ๋ฉ์๋๋ฅผ ์ ์ธํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์ ๋ฉ์๋๋ฅผ ๋๊ธฐํํ๋ ๊ฒ์ ์ค์์
๋๋ค doSomething()
.
public class Main {
private Object obj = new Object();
public void doSomething() {
// ...Some logic available simultaneously to all threads
synchronized (obj) {
// Logic available to just one thread at a time
}
}
}
๋ณด์๋ค์ํผ ๋ฉ์๋์ ์ผ๋ถ์๋ ๋๊ธฐํ๊ฐ ํ์ํ์ง ์์ ๋
ผ๋ฆฌ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ด ์ฝ๋๋ ๋์์ ์ฌ๋ฌ ์ค๋ ๋์์ ์คํํ ์ ์์ผ๋ฉฐ ๋ชจ๋ ์ค์ํ ์์น๋ ๋ณ๋์ synchronized
๋ธ๋ก์ ๋ฐ๋ก ์ค์ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ๋ ๋. ์ด๋ฆ ๊ตํ์ ์ฌ์ฉํ์ฌ ์์
์์ ์ฌ์ฉํ ์๋ฅผ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
public void swap()
{
synchronized (this)
{
// ...Method logic
}
}
์ฐธ๊ณ : ๋๊ธฐํ๋ ๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฉ๋๋คthis
. ์ฆ, ํน์ MyClass
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. Thread-1
2๊ฐ์ ์ค๋ ๋( ๋ฐThread-2
)์ ํ๋์ ๊ฐ์ฒด๋ง์๋ค๊ณ ๊ฐ์ ํฉ๋๋คMyClass myClass
. ์ด ๊ฒฝ์ฐThread-1
ํธ์ถํ๋ฉดmyClass.swap()
๊ฐ์ฒด์ ๋ฎคํ
์ค๊ฐ ์ฌ์ฉ ์ค์ด๋ฉฐ ํธ์ถ์ ์๋ํ๋ฉด๋ฎคํ
์ค๊ฐ ํด์ ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์myClass.swap()
๋ฉ์๋๊ฐ2๊ฐ์ ์ค๋ ๋์ 2๊ฐ์ ๊ฐ์ฒด(๋ฐThread-2
๊ฐ ์๋ ๊ฒฝ์ฐ์ค๋ ๋๋ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด์์ ๋๊ธฐํ๋ ๋ฉ์๋๋ฅผ ์ฝ๊ฒ ๋์์ ์คํํ ์ ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์ค๋ ๋๋ ๋ค์์ ์คํํฉ๋๋ค. MyClass
myClass1
myClass2
myClass1.swap();
๋ ๋ฒ์งธ๋ ๋ค์์ ์คํํฉ๋๋ค.
myClass2.swap();
์ด ๊ฒฝ์ฐ ํน์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋๊ธฐํ๊ฐ ์ํ๋๋ฏ๋ก ๋ฉ์๋ synchronized
๋ด๋ถ์ ํค์๋๋ swap()
ํ๋ก๊ทธ๋จ ์์
์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค. ํ์์ ๊ฒฝ์ฐ 2๊ฐ์ ๊ฐ์ฒด๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ค๋ ๋๋ ์๋ก์๊ฒ ๋ฌธ์ ๋ฅผ ์ผ์ผํค์ง ์์ต๋๋ค. ๊ฒฐ๊ตญ, ๋ ๊ฐ์ฒด์๋ ๋ ๊ฐ์ ์๋ก ๋ค๋ฅธ ๋ฎคํ
์ค๊ฐ ์์ผ๋ฉฐ ํ๋๋ฅผ ํ๋ํ๋ ๊ฒ์ ๋ค๋ฅธ ํ๋๋ฅผ ํ๋ํ๋ ๊ฒ๊ณผ๋ ๋ณ๊ฐ์
๋๋ค .
์ ์ ๋ฉ์๋์์ ๋๊ธฐํ์ ํน์ ๊ธฐ๋ฅ
๊ทธ๋ฌ๋ ์ ์ ๋ฉ์๋๋ฅผ ๋๊ธฐํํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น ?class MyClass {
private static String name1 = "Ally";
private static String name2 = "Lena";
public static synchronized void swap() {
String s = name1;
name1 = name2;
name2 = s;
}
}
์ฌ๊ธฐ์ ๋ฎคํ
์ค๊ฐ ์ด๋ค ์ญํ ์ ํ๋์ง๋ ๋ช
ํํ์ง ์์ต๋๋ค. ๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ ์ด๋ฏธ ๊ฐ ๊ฐ์ฒด์ ๋ฎคํ
์ค๊ฐ ์๋ค๊ณ ๊ฒฐ์ ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฌธ์ ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๋ฐ ๊ฐ์ฒด๊ฐ ํ์ํ์ง ์๋ค๋ ๊ฒ์
๋๋ค MyClass.swap()
. ๋ฉ์๋๋ ์ ์ ์
๋๋ค! ๋ค์์ ๋ฌด์์
๋๊น? :/ ์ค์ ๋ก ์ฌ๊ธฐ์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. Java ์์ฑ์๊ฐ ๋ชจ๋ ๊ฒ์ ์ฒ๋ฆฌํ์ต๋๋ค :) ์ค์ํ ๋์ ๋
ผ๋ฆฌ๋ฅผ ํฌํจํ๋ ๋ฉ์๋๊ฐ ์ ์ ์ด๋ฉด ํด๋์ค ์์ค์์ ๋๊ธฐํ๊ฐ ์ํ๋ฉ๋๋ค. ๋ ๋ช
ํํ๊ฒ ํ๊ธฐ ์ํด ์์ ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ค์ ์์ฑํ ์ ์์ต๋๋ค.
class MyClass {
private static String name1 = "Ally";
private static String name2 = "Lena";
public static void swap() {
synchronized (MyClass.class) {
String s = name1;
name1 = name2;
name2 = s;
}
}
}
์์น์ ์ผ๋ก๋ ๋ค์๊ณผ ๊ฐ์ด ์ค์ค๋ก ์๊ฐํ ์ ์์ต๋๋ค. ๊ฐ์ฒด๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ด ์ด๋ป๊ฒ๋ ํด๋์ค ์์ฒด์ ์ ์ฉ๋์ด์ผ ํฉ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ๊ทธ ๋ฐฉ๋ฒ์
๋๋ค. ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋๊ธฐํํ ์ ์์ต๋๋ค.