728x90
๐ ํ๋ก์ธ์ค?
์ฐ์ ์ค๋ ๋๋ฅผ ์๊ธฐ ์ ๋ฐ๋์ "ํ๋ก์ธ์ค"๋ผ๋ ๊ฒ์ ์์์ผ๋ง ํ๋ค. ๊ทธ๋์ผ ์ ์ค๋ ๋๋ฅผ ์ฐ๋์ง๋ฅผ ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ํ๋ก์ธ์ค๋ฅผ ๋ณดํต ๋ค์ํ๊ฒ ์ ์ํ๋ค. ๊ทธ์ค "์คํ ์ค์ธ ํ๋ก๊ทธ๋จ"์ด๋ผ๋ ํํ์ ๋ง์ด ์ฌ์ฉํ๋ค. ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ "ํ๋ก๊ทธ๋จ"์ด๋ผ๋ ๋จ์ด์ ์ ์๋ฅผ ์์๋ณด์.
ํ๋ก๊ทธ๋จ์ด๋?
์ปดํ์ผํ ์ฝ๋์ ์ด๊ธฐํ ์ ์ญ ๋ณ์, ๋ฌธ์์ด๊ณผ ๋ฌธ์์ด ์์ ๋ฑ ์ ์ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ์ ์ ์ธ ๊ฐ์ฒด์ด๋ค.
๊ทธ๋ ๋ค๋ฉด "์คํ ์ค์ธ ํ๋ก๊ทธ๋จ"์ ํ์ด์ ํด์ํด๋ณด๋ฉด, ๋์คํฌ์ ์๋ ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌํ์ฌ ์ด์์ฒด์ ์ ์ ์ด๋ฅผ ๋ฐ๋ ์ํ๊ฐ ๋์๋ค๋ ๊ฒ. ์ฆ, ์์ ๋ง์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด ์์์ ๋ปํ๋ค. ๊ฒฐ๊ตญ ํ๋ก์ธ์ค์ ์ ์๋ค.
ํ๋ก์ธ์ค ์ ์๋ฅผ ์ข ๋ ์ธ๋ จ๋๊ฒ ์ ๋ฆฌํ์๋ฉด, ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ด๋ฃจ๊ณ , ํ๋ก๊ทธ๋จ ์นด์ดํฐ๋ ๋ ์ง์คํฐ์ฒ๋ผ ํ์ฌ ์ด๋ค ์์์ ์ฌ์ฉํ๋์ง ๊ด๋ จ ์ ๋ณด๊ฐ ๋ค์ด ์๋ ๋์ ์ธ ๊ฐ์ฒด๋ก ํํํ ์ ์๋ค. ๋ ํ๋ก์ธ์ค๋ ํ๋ ์ด์์ ์ค๋ ๋๋ฅผ ๋ฐ๋์ ๊ฐ๋๋ค.
์ด์์ฒด์ ๋ ํ๋ก์ธ์ค์ ์คํ์ ์ ์ดํ๋ค. ๊ทธ๋ฆฌ๊ณ ํ๋ก์ธ์ค๋ ์คํํ๋ฉด์ ์ํ๊ฐ ๋ณํ๋ฏ๋ก(์์ฑ, ์ค๋น, ์คํ, ๋๊ธฐ, ์ข ๋ฃ,...) ์ด์์ฒด์ ๋ ํ๋ก์ธ์ค ์ ์ด์ ํ์ํ ์ํ๋ฅผ ์ ๊ฒํ๊ณ ํ๋ก์ธ์ค๋ฅผ ์ ์ดํ๋ค.
๋๋ต์ ์ผ๋ก ์์ฝํ์๋ฉด ์ด๋ ๋ค. ๋ฌผ๋ก ํ๋ก์ธ์ค ์ ์ด๋ธ๋ก ๋ฑ ์์์ผ ํ ๊ฒ๋ค์ด ๋ง์ด ์์ผ๋ ์ด๋ฒ ๋ธ๋ก๊น ์ฃผ์ ๋ฅผ ๋์ด๊ฐ๋ฏ๋ก ์ฌ๊ธฐ๊น์ง๋ง ์ธ๊ธํ๊ฒ ๋ค.
๐ ์ค๋ ๋?
์์์ ํ๋ก์ธ์ค๋ฅผ ์ฃผ์ ๋ฆฌ์ฃผ์ ๋ฆฌ ์ค๋ช ํ ์ด์ ๋ ์ค๋ ๋๋ ๋ ์์ ๊ฒฐ๊ตญ ํ๋ก์ธ์ค์ ์์์ ํ๋ํ๋ ๋ ์์ด๊ธฐ์ ํ๋ก์ธ์ค๋ฅผ ์ ํ ์์ง ๋ชปํ๊ณ ์๋ ์ด์ผ๊ธฐ๊ฐ ์์๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์์ ํ๋ก์ธ์ค ๋ด์ฉ๋ค์ ํฐ ํ์์ ํค์๋๋ฅผ ๋ฝ์๋ณด์๋ฉด ์์๊ณผ ์ ์ด๋ก ๊ตฌ๋ถํ ์ ์๋ค. ์ด์ค ์ ์ด๋ง ๋ถ๋ฆฌํ ์คํ ๋จ์๋ฅผ ์ค๋ ๋๋ผ๊ณ ํ๋๋ฐ, ํ๋ก์ธ์ค ํ๋๋ ์ค๋ ๋ ํ ๊ฐ ์ด์์ผ๋ก ๋๋ ์ ์๋ค.
์ข ๋ ํน์ง๋ค์ ๋์ดํด๋ณด๊ฒ ๋ค..
- ์ค๋ ๋๋ค์ ํ๋ก์ธ์ค์ ์ง์ ์คํ ์ ๋ณด๋ฅผ ์ ์ธํ ๋๋จธ์ง ํ๋ก์ธ์ค ๊ด๋ฆฌ ์ ๋ณด๋ฅผ ๊ณต์ ํ๋ค.(์ง์ ์คํ ์ ๋ณด : ์คํ, ๋ ์ง์คํฐ // ๋๋จธ์ง ํ๋ก์ธ์ค ๊ด๋ฆฌ ์ ๋ณด : ๋ฉ๋ชจ๋ฆฌ(์ฝ๋, ์ ์ญ ๋ฐ์ดํฐ, ํ)) -> ๊ทธ๋ฆผ 1์ ๋ณด๋ฉด ํ๋ก์ธ์ค ์์ ๋ชจ์ต์ด๋ค.
- ์ค๋ ๋๋ ํ๋ก๊ทธ๋จ ์นด์ดํฐ์ ์คํ ํฌ์ธํฐ ๋ฑ์ ๋น๋กฏํ ์ค๋ ๋ ์คํ ํ๊ฒฝ ์ ๋ณด(๋ฌธ๋งฅ ์ ๋ณด), ์ง์ญ ๋ฐ์ดํฐ, ์คํ ๋ฑ์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ์ง๋ฉด์ ์ฝ๋, ์ ์ญ ๋ฐ์ดํฐ, ํ์ ๋ค๋ฅธ ์ค๋ ๋์ ๊ณต์ ํ๋ค.
- ๊ฐ์ ํ๋ก์ธ์ค์ ์ค๋ ๋๋ค์ ๋์ผํ ์ฃผ์ ๊ณต๊ฐ์ ๊ณต์ ํ๋ค.
ํ๋ก์ธ์ค๊ฐ ํ๋์ธ ์๋ก ๋ค๋ฅธ ํ๋ก์ธ์์์ ํ๋ก๊ทธ๋จ์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋์์ ์คํํ ์ ์๋๋ฐ, ์ค๋ ๋๋ฅผ ์ด์ฉํ๋ฉด ๋ค์ ์ด์ ์ด ์๋ค.
1. ์ฌ์ฉ์ ์๋ต์ฑ ์ฆ๊ฐ : ์์ฉํ๋ก๊ทธ๋จ์ ์ผ๋ถ๋ถ์ ๋ด์ํ๊ฑฐ๋ ๊ธด ์์ ์ ์ํํ๋๋ผ๋ ๋ณ๋ ฌ ํ๋ก๊ทธ๋๋ฐ์ ๊ณ์ ์คํํ ์ ์์ด ์ฌ์ฉ์ ์๋ต์ฑ์ด ์ฆ๊ฐํ๋ค.
2. ํ๋ก์ธ์ค์ ์์๊ณผ ๋ฉ๋ชจ๋ฆฌ ๊ณต์ ๊ฐ๋ฅ
3. ๊ฒฝ์ ์ฑ์ด ์ข๋ค.
4. ๋ค์ค ์ฒ๋ฆฌ(๋ฉํฐ ํ๋ก์ธ์ฑ)๋ก ์ฑ๋ฅ๊ณผ ํจ์จ์ฑ์ด ํฅ์๋๋ค.
์ข ๋ ํ์ด์ ์ค๋ช ์ ํ๋ฉด ํ๋ก์ธ์ค ํ๋ ์์ํ๋ ค๋ฉด ๋ง์ ์์์ด ํ์ํ๋ค. ๋ง์ฝ ํ๋์ ์์ ์ ๋์์ ์ํํ๋ ค๊ณ ํ ๋ ์ฌ๋ฌ ๊ฐ์ ํ๋ก์ธ์ค๋ฅผ ๋์์ ์คํํ๋ฉด ๊ฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํด์ผ๋ง ํ๋ค. JVM์ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฌด๋ฐ ์ต์ ์์ด ์คํํ๋ฉด, ์ ์ด๋ 32MB ~ 64MB์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ ํ๋ค. ๊ทธ์ ๋ฐ์์ ์ค๋ ๋ ํ๋๋ฅผ ์ถ๊ฐํ๋ฉด 1MB ์ด๋ด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ ํ๋ค. ๋ ๋น ๋ฅธ ์๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํด์ฃผ๊ณ ๋ณด๋ค ๋น ๋ฅธ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํด์ง๋ค.
์๋ฐ์์ ํด๋์ค ํ์ผ์ ์๋ํฐ๋ฅผ ํตํด์๋ ์ง์ ํ๋ ์คํํ๊ฒ ๋๋ฉด, ์ ์ด๋ ํ๋์ JVM์ด ์์๋๋ค. ์ด๋ ๊ฒ JVM์ด ์์๋๋ฉด, ์๋ฐ ํ๋ก์ธ์ค๊ฐ ์์ํ๋ค. ์ด ํ๋ก์ธ์ค๋ผ๋ ์ธํ๋ฆฌ ์์์ ํ๋ ํน์ ์ฌ๋ฌ ๊ฐ์ ์ค๋ ๋๋ค์ด ๋์ํ๊ฒ ๋๋ค.
์ด ์ ๋๋ฉด ์ค๋ ๋์ ๋น์์ฑ์ ์ถฉ๋ถํ ์ค๋ช ์ด ๋์์ ๊ฑฐ๋ผ ์๊ฐํ๋ฉฐ ์์ ๋ฅผ ํตํด ์ฌ์ฉ๋ฒ์ ์์๋ณด์
๐ฏ Runnable ์ธํฐํ์ด์ค์ Thread ํด๋์ค
์ค๋ ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ํฌ๊ฒ Runnable ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ, Thread ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ค. ๋ชจ๋ java.lang ํจํค์ง์ ์๋ค. ๋ Thread ํด๋์๋ Runnable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์๋ค. ์ฌ์ค์ ๊ฐ์ ๋ ์์ด๋ผ๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์? ๊ตณ์ด ๋ ๊ฐ์ง์ ๋ฐฉ์์ด ์กด์ฌํ๋ ๊ฒ์ผ๊น?
๊ทธ ์ด์ ๋ ์์์ด๋ผ๋ ๊ด์ ์์ ์๊ฐํด๋ณด๋ฉด ์์ธ์ ์ฝ๊ฒ ์ฐพ์ ์ ์๋ค. ์๋ฐ์์๋ ํ๋์ ํด๋์ค๋ง ํ์ฅํ ์ ์๋ ํน์ฑ. ์ฆ, ๋ค์ค ์์์ด ๋ถ๊ฐํ๋ค. ์ด๋ฌํ ์ด์ ๋ก ๋ด๊ฐ ๋ค๋ฅธ ํด๋์ค๋ฅผ ํ์ฅํด์ผ ํ๋๋ฐ ๊ทธ ๋ค๋ฅธ ํด๋์ค๊ฐ Thread๋ฅผ ํ์ฅํ๊ณ ์์ง ์๋ค๋ฉด ๋ ์ด์ ํ์ฅํ ๊ธธ์ด ์๋ ๊ฒ์ด๋ค. ํ๋ง๋๋ก ์ด๋ค ์ํฉ์์๋ ๋ค์ค ์์์ด ํ์ํด์ง๋ค๋ ๊ฒ์ด๋ค.
์ด ์์ ์ ์ธํฐํ์ด์ค ํน์ง์ ์ดํด๋ณด๋ฉด ์ ๋ ์์ ์ฌ๋ฌ ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด๋ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค.
์ด ๋ถ๋ถ์ ๊ฐ๋จํ ์ค๋ช ํ๋ฉด ํ์ฅ์ด ํ์ํ ๊ฒฝ์ฐ์๋ Runnable ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ ๊ฒ์ด๊ณ , ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์๋ Thread ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
์์ ๋ฅผ ํตํด ์ดํด๋ณด์
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
package com.study;
// Runnable interface ๊ตฌํ
class RunnableSample1 implements Runnable {
@Override
public void run() {
System.out.println("my runnable thread !");
}
}
// Thread ํด๋์ค ์์
class ThreadsSample1 extends Thread {
@Override
public void run() {
System.out.println("my thread !");
}
}
// entry point
public class RunThreads {
public static void main(String[] args) {
RunThreads sample = new RunThreads();
sample.runBasic();
}
public void runBasic() {
RunnableSample1 runable = new RunnableSample1();
new Thread(runable).start();
ThreadsSample1 thread = new ThreadsSample1();
thread.start();
System.out.println("End!");
}
}
|
cs |
์ค๋ ๋๊ฐ ์ํ๋๋ ๊ตฌํํ๋ ๋ฉ์๋๋ run() ๋ฉ์๋์ด๋ค.
์ค๋ ๋๋ฅผ ์์ํ๋ ๋ฉ์๋๋ start()์ด๋ค.
Runnable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ RunnableSample1 ํด๋์ค๋ฅผ ์ค๋ ๋๋ก ๋ฐ๋ก ์์ํ ์ ์๋ค. ๋ฐ๋์ Thread ํด๋์ค์ ์์ฑ์์ ํด๋น ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ์ฌ ์์ํด ์ฃผ์ด์ผ๋ง ํ๋ค.
์ฝ๋์ ๊ฒฐ๊ณผ์ด๋ค. ์ด ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์์๊ฐ ๊ณ์ ๋ฐ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋๋ฐ, ์ด๋ ์์ ์ค๋ ๋ ์ค๋ช ์ ๋ณด๋ฉด ์ฝ๊ฒ ์ดํดํ ์ ์๋ค. ๋ฐ๋ก ๋ฐ๋ก(๋ณ๋ ฌ) ์ผ์ ๋์์ ์์ํ๊ธฐ ๋๋ฌธ์ด๋ค. start()๋ฅผ ํตํด ์์ํ๋ฉด ํ๋์ ์ค๋ ๋๊ฐ JVM์ ์ถ๊ฐํ์ฌ ์คํ๋๋ค. ์ด๋ ๊ฒ ์คํ๋ ์ค๋ ๋๋ค์ ์ค๋ ๋๋ค ๋ง๋ค ๋๋๋ ์์๊ฐ ๊ทธ๋๊ทธ๋ ๋ค๋ฅธ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ณธ์ธ์ ์๋ฌด๋ฅผ ์๋ฃํ ์ฆ์ ์ข ๋ฃํ๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ํ๋ ์ง๊ณ ๋์ด๊ฐ์ผ ํ ์ ์ ์ค๋ ๋๊ฐ ์์ฑ๋ ๋๋ง๋ค ๋ณ๋์ ์คํ์ด ํ ๋น๋๋ค๋ ๊ฒ์ด๋ค.
๐ฏ ๋ฐ๋ชฌ ์ค๋ ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
package com.study;
class EndlessThread1 extends Thread {
@Override
public void run() {
while(true) {
try {
System.out.println(System.currentTimeMillis());
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// entry point
public class RunThreads {
public static void main(String[] args) {
RunThreads sample = new RunThreads();
sample.endless();
}
public void endless() {
EndlessThread1 thread = new EndlessThread1();
thread.start();
}
}
|
cs |
์์ ์ฝ๋๋ฅผ ์คํ์์ผ๋ณด๋ฉด main() ๋ฉ์๋์ ์ํ์ด ๋๋๋, main() ๋ฉ์๋๋, ๋ค๋ฅธ ๋ฉ์๋์์ ์์ํ ์ค๋ ๋๊ฐ ์ข ๋ฃํ์ง ์์ผ๋ฉด ํด๋น ์๋ฐ ํ๋ก์ธ์ค๋ ๋๋์ง ์๋๋ค.
์ด์ ์๋์ ์ฝ๋๋ฅผ ๋ณด์.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
package com.study;
class DaemonThread1 extends Thread {
@Override
public void run() {
while (true) {
try {
System.out.println(System.currentTimeMillis());
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// entry point
public class RunThreads {
public static void main(String[] args) {
RunThreads sample = new RunThreads();
sample.runDaemonThread();
}
public void runDaemonThread() {
DaemonThread1 thread = new DaemonThread1();
thread.setDaemon(true);
thread.start();
}
}
|
cs |
์์ ์ฝ๋๋ฅผ ์คํ์์ผ๋ณด๋ฉด ์์ ์ฝ๋์์ setDaemon๋ง ์ถ๊ฐ๋์์ง๋ง, ๋ฌดํ๋ฃจํ์ ๋น ์ง์ง ์๊ณ ์ข ๋ฃ๊ฐ ๋์ด๋ฒ๋ฆฐ๋ค. ์ฆ ์ด๋ค ์ค๋ ๋๋ฅผ ๋ฐ๋ชฌ์ผ๋ก ์ง์ ํ๋ฉด, ๊ทธ ์ค๋ ๋๊ฐ ์ํ๋๊ณ ์๋ , ์ํ๋์ง ์๊ณ ์๋ ์๊ด์์ด JVM์ด ๋๋ ์ ์๋ค. ๋จ ํด๋น ์ค๋ ๋๊ฐ ์์๋๊ธฐ ์ ๋ฐ๋ชฌ ์ค๋ ๋๊ฐ ์ง์ ๋์ด์ผ๋ง ํ๋ค.(setDaemon(true))
๊ทธ๋ฌ๋ฉด ์? ์ด๋ฌํ ๋ฐ๋ชฌ ์ค๋ ๋๋ฅผ ๋ง๋ค์์๊น?
์๋ฐ์์ ์ค๋ ๋๋ ๊ฐ์์ ์์ ์ด ๋๋ ๋๊น์ง ๊ณ์ํด์ ์์ ์ ํ๊ฒ ๋์ด ์๋ค. ๊ทธ๋ฐ๋ฐ ํ์์ ๋ฐ๋ผ์ ๊ณ์ํ ํ์๊ฐ ์๋ ์ค๋ ๋๋ ์๋ค. ์๋ฅผ ๋ค์ด ๋ฌธ์ ํธ์ง๊ธฐ์ ์๋ ์ ์ฅ ๊ธฐ๋ฅ์ด ์๊ณ , ๊ทธ ์๋ ์ ์ฅ ๊ธฐ๋ฅ์ด ๋ณ๋์ ์ค๋ ๋๋ก ๋๊ณ ์๋ค๊ณ ๊ฐ์ ์ ํด๋ณด์.
์ด๋ ๋ฌธ์ ํธ์ง๊ธฐ๊ฐ ๋๋๋ฉด ์๋ ์ ์ฅ ๊ธฐ๋ฅ ์ค๋ ๋๋ ์ฌ๋ผ์ง๋ ๊ฒ ๋น์ฐํ ๊ฒ์ด๋ค. ๊ทธ๋์ ๋์จ ๊ฒ์ด ๋ฐ๋ชฌ ์ค๋ ๋์ด๋ค.
๋ฐ๋ชฌ(daemon) ์ค๋ ๋
: ์ฃผ ์ค๋ ๋์ ์์ ์ ๋๋ ๋ณด์กฐ์ ์ธ ์ญํ ์ ์ํํ๋ ์ค๋ ๋
: ์ฃผ ์ค๋ ๋๊ฐ ์ข ๋ฃ๋๋ฉด ๋ฐ๋ชฌ ์ค๋ ๋๋ ๊ฐ์ ์ ์ผ๋ก ์๋ ์ข ๋ฃ
=> ์๋ ํ๋ก์ธ์์ ์๋ ์ ์ฅ, ๋ฏธ๋์ด ํ๋ ์ด์ด์ ๋์์ ๋ฐ ์์ ์ฌ์, ๊ฐ๋น์ง ์ปฌ๋ ํฐ
๐ฏ Synchronized
์ด๋ค ํด๋์ค๋ ๋ฉ์๋๊ฐ ์ค๋ ๋์ ์์ ํ๋ ค๋ฉด, synchronized๋ฅผ ์ฌ์ฉํด์ผ๋ง ํ๋ค.
์ฌ๋ฌ ์ค๋ ๋๊ฐ ํ ๊ฐ์ฒด์ ์ ์ธ๋ ๋ฉ์๋์ ์ ๊ทผํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ค๊ณ ํ ๋ ๋์์ ์ฐ์ฐ์ ์ํํ์ฌ ๊ฐ์ด ๊ผฌ์ด๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ฆ, ๋งค๊ฐ๋ณ์๋ ๋ฉ์๋์์๋ง ์ฌ์ฉํ๋ ์ง์ญ ๋ณ์๋ง ๋ค๋ฃจ๋ ๋ฉ์๋๋ ์ ํ ํ์๊ฐ ์๋ค.
synchronized๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
- ๋ฉ์๋ ์์ฒด๋ฅผ synchronized๋ก ์ ์ธํ๋ ๋ฐฉ๋ฒ : synchronized methods
- ๋ฉ์๋ ๋ด์ ํน์ ๋ฌธ์ฅ๋ง synchronized๋ก ๊ฐ์ธ๋ ๋ฐฉ๋ฒ : synchronized statements
๋ง์ฝ ์ด synchronized๋ผ๋ ๋จ์ด๊ฐ ๋ฉ์๋ ์ ์ธ๋ถ์ ์์ผ๋ฉด, ๋์ผํ ๊ฐ์ฒด์ ์ด ๋ฉ์๋์ ์ฌ๋ฌ ๊ฐ์ ์ค๋ ๋๊ฐ ์ ๊ทผํ์ฌ๋ ํ ์๊ฐ์๋ ํ๋์ ์ค๋ ๋๋ง ์ด ๋ฉ์๋๋ฅผ ์ํํ๊ฒ ๋๋ค.
๐ฏ Synchronized : synchronized methods
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
package com.study;
class CommonCalc {
private int amount;
public CommonCalc() {
amount = 0;
}
public void plus(int value) {
amount += value;
}
public void minus(int value) {
amount -= value;
}
public int getAmount() {
return amount;
}
}
class ModifyAmountThread1 extends Thread {
private CommonCalc calc;
private boolean addflag;
public ModifyAmountThread1(CommonCalc calc, boolean addFlag) {
this.calc = calc;
this.addflag = addFlag;
}
@Override
public void run() {
for(int i = 0; i < 10000; i++) {
if(addflag) {
calc.plus(1);
} else {
calc.minus(1);
}
}
}
}
// entry point
public class RunThreads {
public static void main(String[] args) {
RunThreads sample = new RunThreads();
sample.runCommonCalc();
}
public void runCommonCalc() {
CommonCalc calc = new CommonCalc();
ModifyAmountThread1 thread1 = new ModifyAmountThread1(calc, true);
ModifyAmountThread1 thread2 = new ModifyAmountThread1(calc, true);
thread1.start();
thread2.start();
try {
thread1.join();
thread2.join();
System.out.println("Final value is " + calc.getAmount());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
|
cs |
์์ ์ฝ๋์์ runCommonCalc()๋ฅผ ํตํด thread1, thread2 ๊ฐ ์คํ๋๋ค. ์ฌ๊ธฐ์ ๊ฐ๊ฐ 10000 ์ฉ plus ํ์ฌ 20000์ด๋ผ๋ ๊ฐ์ ๊ธฐ๋ํ๊ฒ ์ง๋ง ๋ง์ ์คํ์ ์์ผ๋ณด๋ฉด, "Final value is 15749" ์ด๋ฐ ์์ผ๋ก ์ด์ํ ๊ฐ์ด ์ฐํ ๊ฒ์ด๋ค. ๋ ์ฌ๋ฌ ๋ฒ ์ํ์ํฌ ๋๋ง๋ค ๊ฐ์ด ๋ฐ๋ ๊ฒ์ด๋ค. ์ด๋ ๋ ๊ฐ์ ์ค๋ ๋๊ฐ ๋์ผ ๊ฐ์ฒด์ plus๋ฉ์๋๋ฅผ ํตํด ๋ฐ์ดํฐ์ ๋์์ ์ ๊ทผํ์ฌ ๊ฐ์ ๊ฒฝ์ ํ์๊ธฐ์ ๊ผฌ์ธ ๊ฒ์ด๋ค. ์ฆ thread1์ ๋ฐ์ดํฐ๊ฐ 1์ผ ๋ ๋ณ์์ ๊ฐ์ 1์ ๋ํด์ ๊ฐฑ์ ์์ผฐ๋๋ฐ, thread2๋ ๋ฐ์ดํฐ๊ฐ 1์ผ ๋ ๋ณ์์ ๊ฐ์ ๋์์ 1์ ์ฆ๊ฐ์์ผ ๋ฒ๋ฆฐ ๊ผด์ด ๋ ๊ฒ์ด๋ค. ์๋์ ๊ฐ 1๊ณผ, thread1์ 1, thread2์ 1์ด ๋ํด์ ธ์ 3์ด ๋์ด์ผ ํ์ง๋ง 2๊ฐ ์ฐํ๋ฒ๋ฆฐ ๊ฒ์ด๋ค.
์ด ์ํฉ์ด ์ํ์์ ๋ฒ์ด์ก๋ค๊ณ ์๊ฐํด๋ณด์ ๋์ฐํ ์ฌ์์ด ๋ ๊ฒ์ด๋ค...
plus ๋ฉ์๋์ synchronized๋ฅผ ๋ถ์ฌ์ฃผ๊ณ ์คํ์ ํด๋ณด๋ฉด, ์ฐ๋ฆฌ๊ฐ ์๊ฐํ "Final value is 20000" ๊ทธ ๊ฐ์ด ์ฐํ๋ค. ์ด์ plus๋ฉ์๋๋ ์ค๋ ๋์ ์์ ํ๋ค๊ณ ํ ์ ์๋ค.
1
2
3
|
public synchronized void plus(int value) {
amount += value;
}
|
cs |
๐ฏ Synchronized : synchronized statesments
์์์์ฒ๋ผ ๋ฉ์๋ ์ ์ฒด๋ฅผ synchronized ํด๋ฒ๋ฆด ๊ฒฝ์ฐ ์ฑ๋ฅ์ ๋ฌธ์ ์ ์ด ๋ฐ์ํ ์ ์๋ค.
์๋ฅผ ๋ค์ด ์ด๋ค ํด๋์ค์ 30์ค์ง๋ฆฌ ๋ฉ์๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์. ๊ทธ ํด๋์ค์๋ amount๋ผ๋ ์ธ์คํด์ค ๋ณ์๊ฐ ์๊ณ , 30์ค์ง๋ฆฌ ๋ฉ์๋์์ amount๋ผ๋ ๋ณ์๋ฅผ ํ ์ค์์๋ง ๋ค๋ฃฌ๋ค. ๋ง์ฝ ํด๋น ๋ฉ์๋ ์ ์ฒด๋ฅผ synchronized๋ก ์ ์ธํ๋ค๋ฉด, ๋๋จธ์ง 29์ค์ ์ฒ๋ฆฌ๋ฅผ ํ ๋ ํ์ ์๋ ๋๊ธฐ ์๊ฐ์ด ๋ฐ์ํ๊ฒ ๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ์๋ ๋ฉ์๋ ์ ์ฒด๋ฅผ ๊ฐ์ธ๋ฉด ์ ๋๋ฉฐ, amount๋ผ๋ ๋ณ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ถ๋ถ๋ง synchronized ์ฒ๋ฆฌ๋ฅผ ํด ์ฃผ๋ฉด ๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
// synchronized (this) ์ดํ์ ์๋ ์ค๊ดํธ ๋ด์ ์๋ ์ฐ์ฐ๋ง ๋์์ ์ฌ๋ฌ ์ค๋ ๋์์ ์ฒ๋ฆฌํ์ง ์๊ฒ ๋ค๋ ๋ป์ด๋ค.
public void plus(int value) {
synchronized (this) {
amount += value;
}
}
// ์ผ๋ฐ์ ์ผ๋ก๋ ์ด๋ ๊ฒ ์ฌ์ฉํ๋ค.
Object lock = new Object();
public synchronized void minus(int value) {
synchronized (lock) {
amount -= value;
}
}
|
cs |
์ฌ๊ธฐ์ ์ฌ์ฉํ lock์ด๋ผ๋ ๊ฐ์ฒด๋, ์์ ์ฌ์ฉํ this๋ ๋ชจ๋ ๋ฌธ์ง๊ธฐ๋ผ๊ณ ๋ณผ ์ ์๋ค. ๋ฌธ์ง๊ธฐ๋ ํ๋์ ์ค๋ ๋๋ง ์ผ์ ํ ์ ์๋๋ก ํ์ฉํด์ค๋ค. ๋ง์ฝ ๋ธ๋ก์ ๋ค์ด๊ฐ ์ค๋ ๋๊ฐ ์ผ์ ๋ค ์ฒ๋ฆฌํ๊ณ ๋์ค๋ฉด, ๋ฌธ์ง๊ธฐ๋ ๋๊ธฐํ๊ณ ์๋ ๋ค๋ฅธ ์ค๋ ๋์๊ฒ ๊ธฐํ๋ฅผ ์ค๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
private int amount;
private int interest;
public CommonCalc() {
amount = 0;
interest = 0;
}
private Object interestLock = new Object();
private Object amountLock = new Object();
public void plus(int value) {
synchronized (amountLock) {
amount += value;
}
}
public void addInterest(int value) {
synchronized (interestLock) {
interest += value;
}
}
|
cs |
๋์ ๋ฐ๋ผ์ ์์ ์ฝ๋์ฒ๋ผ amount, interest ๋ ๊ฐ์ ๋ณ์ ๋ชจ๋ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์ ๊ทผํ๋ฉด ์ ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ด๋ด ๋ lock์ด๋ผ๋ ํ๋์ ์ ๊ธ์ฉ ๊ฐ์ฒด๋ง ์ฌ์ฉํ๋ฉด amount๋ผ๋ ๋ณ์๋ฅผ ์ฒ๋ฆฌํ ๋, interest๋ผ๋ ๋ณ์๋ฅผ ์ฒ๋ฆฌํ๋ ค๋ ๋ถ๋ถ๋ ์ฒ๋ฆฌ๋ฅผ ๋ชปํ๊ฒ ๋๋ค. ๋ฐ๋ผ์, ๋ ๊ฐ์ ๋ณ๋์ lock ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์จ์ ์ธ ํ๋ก๊ทธ๋จ์ด ๋๋ค.
๐ ๋ง๋ฌด๋ฆฌ
์ฌ๊ธฐ๊น์ง ์๋ฐ ์ค๋ ๋๋ฅผ ๋ค์ด๊ฐ๊ธฐ์ ์์ ๊ฐ๋ ์ ์ดํด๋ณด์๊ณ ์ค๋ ๋์ ๋ํด์ ๋๋ต์ ์ผ๋ก ์ดํด๋ณด์๋ค ๋ฌผ๋ก ์ด์ธ์๋ ๋ค์ํ ๋ฉ์๋๋ฅผ ์ง์ํ๋ค. ํ์ง๋ง ๋ธ๋ก๊น ๋ชฉ์ ์ ์ค๋ ๋์ ํฐ ํ๊ณผ ๋ฉ์ปค๋์ฆ์ ์ดํดํ๊ณ ๋๋ต์ ์ธ ๋ถ๋ถ์ ์ฝ๋๋ก ์ดํด๋ณด๊ณ ์ ์ด๋ ๊ฒ ๊ธ์ ์ผ๋ค. 2ํธ์์๋ ์ค๋ ๋ ์ํ ์ ๋ณด ๊ด๋ จํด์ ์์๋ณผ ์์ ์ด๋ค.
์ถ์ฒ:
- [๊ต์ฌ] ๊ทธ๋ฆผ์ผ๋ก ๋ฐฐ์ฐ๋ ๊ตฌ์กฐ์ ์๋ฆฌ ์ด์์ฒด์ (๊ตฌํํ ์ )
- [๊ต์ฌ] ์๋ฐ์์ (์ด์๋ฏผ ์ )
- https://yoonemong.tistory.com/216 [Sw.Dev]
- https://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html
- https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html
๋ฐ์ํ
'SKILL > JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋ฐ : Fork/Join framework (0) | 2021.09.09 |
---|---|
์๋ฐ : ์ค๋ ๋(2) (0) | 2021.09.08 |
์๋ฐ : java 7 - ๋ณด์๋ ์์ธ ์ฒ๋ฆฌ (0) | 2021.09.03 |
์๋ฐ : Heap pollution ์ด๋? (0) | 2021.09.02 |
์ ๋ค๋ฆญ์ด๋? (0) | 2021.09.01 |