메인.-쓰레드 객체 생성, 시작
public static void main(String[] args) {
ShareObject sObj = new ShareObject(); // 공통으로 사용할 객체 생성
TestThread th1 = new TestThread("Test1", sObj);
TestThread th2 = new TestThread("테스트2", sObj);
th1.start();
th2.start();
}
테스트 클래스를 만들어서 생성자에 쓰레드 이름과 공통으로 사용할 객체를 파라미터로 받는다.
class TestThread extends Thread{
private ShareObject sObj;
// 생성자
public TestThread(String name, ShareObject sObj) {
super(name); // 쓰레드의 name속성 설정
this.sObj = sObj;
}
@Override
public void run() {
for(int i=0; i<10; i++) {
sObj.add();
}
}
}
이렇게 실행하면.... 결과가 뒤죽박죽.... !
10부터 차례로 더해지지만 출력할 때는 10->20->50->30-> ... 200 : 이런 식으로 뒤죽박죽 나온다.
결국 200은 나오지만 과정 출력이 이상함.
서로 객체를 동시에 사용해서 그럼.
// !! 잘못된 것
// 공통으로 사용할 객체
class ShareObject{
private int sum = 0;
public void add() {
int n = sum;
n += 10;
sum = n; ///sum이 10씩 더해지도록 하는데 과정에서 다른 쓰레드가 끼어드는 확률을 높이려고 과정을 쪼갰음.
System.out.println(Thread.currentThread().getName() + " 합계 : " + sum);
}
}
동기화 처리를 해서 락을 걸어버리면 하나의 쓰레드가 다 사용한 후에 다음 쓰레드가 사용하므로
교착상태가 되지 않을 수 있다.
//synchronized
방법1) 메서드 자체에 동기화 설정을 한다.
public synchronized void add() {
방법2) 동기화 블록으로 설정한다.
synchronized (참조값){
동기화 필요한 내용...! (쓰레드가 공통으로 사용하는 자료)
}
class ShareObject{
private int sum = 0;
// 동기화 처리하기
// 방법1) 메서드 자체에 동기화 설정을 한다. ///synchronized
// public synchronized void add() {
public void add() {
// 방법2) 동기화 블록으로 설정한다.
synchronized (this) {
int n = sum;
n += 10;
sum = n; ///sum이 10씩 더해지도록 하는데 과정에서 다른 쓰레드가 끼어드는 확률을 높이려고 과정을 쪼갰음.
System.out.println(Thread.currentThread().getName() + " 합계 : " + sum);
}
}
}
------ 결 과 -------
테스트2 합계 : 10
테스트2 합계 : 20
테스트2 합계 : 30
Test1 합계 : 40
Test1 합계 : 50
Test1 합계 : 60
Test1 합계 : 70
Test1 합계 : 80
Test1 합계 : 90
Test1 합계 : 100
Test1 합계 : 110
Test1 합계 : 120
Test1 합계 : 130
테스트2 합계 : 140
테스트2 합계 : 150
테스트2 합계 : 160
테스트2 합계 : 170
테스트2 합계 : 180
테스트2 합계 : 190
테스트2 합계 : 200
-------------------------------> 차례로 예쁘게 나온다.
'내가 보려고 정리하는 > JAVA' 카테고리의 다른 글
동기화 처리가 되어있는 Vector (0) | 2022.12.28 |
---|---|
쓰레드로 은행의 입출금 처리하기! (동기화 처리 예제) (0) | 2022.12.28 |
Thread(쓰레드)를 이용한 가위, 바위, 보 게임 (0) | 2022.12.27 |
처음 보는 것들... + 조금씩 추가될 예정...! (0) | 2022.12.27 |
로또를 뽑아보자! (0) | 2022.12.20 |