[JAVA]

자바 쓰레드 synchronized

지기음 2022. 10. 31. 14:55

synchronized는 쓰레드를 동시에 사용할 때 동시에 임계영역에 들어오지 못하도록 할 수 있다. 

1. wait() 

- 쓰레드 기다려! 

2. notify() / notifyAll()

- 쓰레드 가자! 일어나! 산책가자 

 

예제) 생산자와 소비자 

생산자 쓰레드가 데이터를 저장한 후 소비자 쓰레드가 데이터를 꺼낼 수 있다 ,

생산자 쓰레드는 소비자 쓰레드가 버퍼에서 데이터를 가져가지 않았으면 데이터를 버퍼에 저장할 수 없고 wait()

 

풀이 

1. 생산자 쓰레드와 소비자 쓰레드를 공동 저장할 수 있는 버퍼를 제작하자 

Buffer.java

public class Buffer {
	int data = 0;
	boolean available = false;
	
	public synchronized int get() { // 소비자 
		while(available==false) {
			try {
				wait();
			}
			catch(Exception e) {}
		}
		available= false;
		notifyAll();
		
		return data;
	}
	public synchronized int put(int num) {  //생산자 
		while(available==true) {
			try {
				wait();
			}
			catch(Exception e) {}
		}
		data = num;
		available= true;
		notifyAll();
		
		return data;
	}
}

2. 소비자 

Consumer.java

import java.util.Random;
public class Consumer extends Thread {
	Buffer dataBuffer;
	
	public Consumer(Buffer b) {
		dataBuffer = b;
		
	}
	
	public void run() {
		Random r = new Random();
		for(int i = 0; i<5;i++) {
			int num = dataBuffer.get();
			System.out.println("소비자 : " +num);
			try {
				sleep(Math.abs(r.nextInt()%100));//대기대기
			}catch(Exception e){}
		}
	}

}

3. 생산자 

import java.util.Random;
public class Producer extends Thread {
	Buffer dataBuffer;
	
	public Producer(Buffer b) {
		dataBuffer = b;
		
	}
	
	public void run() {
		Random r = new Random();
		for(int i = 0; i<5;i++) {
			dataBuffer.put(i);
			System.out.println("생산자 : " +i);
			try {
				sleep(Math.abs(r.nextInt()%100));//대기대기
			}catch(Exception e){}
		}
	}

}

4. 

쓰레드 시작

public class ProducerConsumer {

	public static void main(String[] args) {
		Buffer b= new Buffer();
		
		Producer p = new Producer(b);
		p.start();
		
		Consumer c= new Consumer(b);
		c.start();
	}

}

'[JAVA]' 카테고리의 다른 글

Abstraction + @ (추상화와 그 외의 중요한 것들)  (0) 2023.01.17
NullPointerException  (0) 2022.12.22
discord로 IntelliJ하는거 티내는 방법  (0) 2022.12.21
java char to int  (0) 2022.12.21
JAVA EOF (scanner + buffered reader)  (0) 2022.11.02