본문 바로가기
프로그래밍/자바

자바 멀티 쓰레드(Thread) 동기화 예제

by 밍구몬 2019. 3. 5.

자바에서 멀티스레딩을 하게 되는 경우 같은 프로세스 내의 자원을 공유하여 작업하기 때문에 서로의 작업에 영향을 줄 수 있어 동기화를 해주어야한다.

스레드의 동기화의 방법은 임계영역을 지정하고 하나의 스레드만 임계영역에 접근하게 해주는 것이다.

 

synchronized 동기화

 

객체 동기화

 

synchronized(객체 참조 변수) {

...

}

 

메소드 동기화

 

synchronized void test(){

...

}

 

 

객체 동기화 예제

 

 

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();

}

}