스레드의 동기화

염지은·2021년 12월 12일
0

java

목록 보기
40/45

[ 스레드의 동기화 ]

  • 하나의 객체(자원)을 여러개의 스레드가 공유해서 사용할때
    하나의 스레드가 사용중이면 다른 스레드는
    사용할 수 없으며 잠금(lock)인 상태가 되는것
  • 동기화 처리방법
    방법1) 동기화할 객체에 synchronized블록으로 묶기
    synchronized(공유객체){
    ..
    }
    방법2) 동기화할 클래스 자체에서 synchronized메소드 만들기
    public synchronized 리턴형 메소드명(...){
    ..
    }
    class InputThread extends Thread{
    	private Data data;
    	public InputThread(Data data) {
    		this.data=data;
    	}
    	@Override
    	public void run() {	
    		synchronized (data) {
    			for(int i=0;i<100;i++) {
    				for(int j=1;j<=100000000;j++);
    				data.setData(i+1, i);
    			}
    		}//lock이 풀림->대기중인 스레드가 공유객체를 사용할수 있음
    	}
    }
    class OutputThread extends Thread{
    	private Data data;
    	public OutputThread(Data data) {
    		this.data=data;
    	}	
    	@Override
    	public void run() {	
    		synchronized (data) {
    			int[] b=data.getData();
    			for(int n:b) {
    				System.out.print(n +" ");
    			}
    			System.out.println();
    		}
    	}
    }
    public class Test04_동기화 {
    	public static void main(String[] args) {
    		Data data=new Data();
    		InputThread thread1=new InputThread(data);
    		thread1.start();
    		OutputThread thread2=new OutputThread(data);
    		thread2.start();
    	}
    }

0개의 댓글