자바에서 멀티스레딩을 하게 되는 경우 같은 프로세스 내의 자원을 공유하여 작업하기 때문에 서로의 작업에 영향을 줄 수 있어 동기화를 해주어야한다.
스레드의 동기화의 방법은 임계영역을 지정하고 하나의 스레드만 임계영역에 접근하게 해주는 것이다.
synchronized 동기화
객체 동기화
synchronized(객체 참조 변수) {
...
}
메소드 동기화
synchronized void test(){
...
}
객체 동기화 예제
- 이전에 https://ming9mon.tistory.com/43 에서 사용했던 소스에서 synchronized만 추가해주면 된다.
import java.lang.Thread;
class Sum{
int num=0;
int sum(){
for(int i=0;i<1000;i++) {
num+=1;
}
return num;
}
}
class ThreadEX implements Runnable{
Sum s = new Sum();
public void run() {
String threadName = Thread.currentThread().getName(); //쓰레드 이름 받아오기
synchronized(s) {
System.out.println(threadName+" : "+s.sum());
}
}
}
public class Main {
public static void main(String[] args) {
Runnable r = new ThreadEX();
Thread ex1 = new Thread(r,"a"); //첫번째 쓰레드 객체 생성 쓰레드 이름은 a
Thread ex2 = new Thread(r,"b"); //두번째 쓰레드 객체 생성 쓰레드 이름은 b
//멀티 쓰레드 시작
ex1.start();
ex2.start();
}
}
실행결과
메소드 동기화 예제
import java.lang.Thread;
class Sum{
int num=0;
synchronized int sum(){
for(int i=0;i<1000;i++) {
num+=1;
}
return num;
}
}
class ThreadEX extends Thread{
Sum s = new Sum();
public void run() {
String threadName = Thread.currentThread().getName(); //쓰레드 이름 받아오기
System.out.println(threadName+" : "+s.sum());
}
}
public class Main {
public static void main(String[] args) {
ThreadEX r = new ThreadEX();
Thread ex1 = new Thread(r,"a"); //첫번째 쓰레드 객체 생성 쓰레드 이름은 a
Thread ex2 = new Thread(r,"b"); //두번째 쓰레드 객체 생성 쓰레드 이름은 b
//멀티 쓰레드 시작
ex1.start();
ex2.start();
}
}
'프로그래밍 > 자바' 카테고리의 다른 글
자바 Swing으로 GUI 만들기 (0) | 2019.03.11 |
---|---|
자바 숫자야구 소스 (0) | 2019.03.07 |
자바 쓰레드(Thread) (0) | 2019.03.01 |
자바 파일 입출력 과 입출력 스트림 (0) | 2019.02.27 |
자바 Jsoup를 이용한 웹 크롤링 예제 (3) | 2019.02.25 |