본문 바로가기
Today I learned

Java Synchronization

by soheemon 2021. 8. 6.

https://www.javatpoint.com/synchronized-block-example

 

Synchronized Block in Java - javatpoint

Synchronized block in java with examples and difference between java synchronized method and synchronized block with examples on static synchronization, synchronized method, synchronized block, inter-thread communication etc.

www.javatpoint.com

* Thread

해당 예제에서, 두개의 쓰레드는 하나의 객체를 공유한다. ** 각각의 고유한 객체를 가지면 동기화가 필요없다
두 Thread는 printTable을 호출한다.
-> 동일한 객체에서 Method는 Thread간에 공유하는 자원이다.
하나의 Thread가 로직을 실행하는 순간에도 다른 Thread가 치고 들어올수 있다

하지만 synchronized키워드가 붙어있다면..
해당 함수가 동작중이라면, 다른 Thread가 치고 들어오지 못한다. 즉, 실행이 끝날때까지 기다리게 된다.

 

* block

메서드 레벨이 아니라 블록레벨에서 지정이 가능하다.
공유할 객체를 인자로 넣어준다.

 

synchronized (object reference expression) {   
  //code block   
}



* 정적 메서드 && 필드 같은경우엔 Thread레벨에서 공유하는 자원이므로 위와같은 문제가 발생할 수 있다. 원리는 같음.

 

*DeadLock. 

public class Test1 {  
  public static void main(String[] args) {  
    final String resource1 = "ratan jaiswal";  
    final String resource2 = "vimal jaiswal";  
    // t1 tries to lock resource1 then resource2  
    Thread t1 = new Thread() {  
      public void run() {  
          synchronized (resource1) {  //resource1를 락잡은 상태에서
           System.out.println("Thread 1: locked resource 1");  
  
           try { Thread.sleep(100);} catch (Exception e) {}  
  
           synchronized (resource2) {  //resource2를 락잡기를 시도...
            System.out.println("Thread 1: locked resource 2");  	//DeadLock 발생!
           }  
         }  
      }  
    };  
  
    // t2 tries to lock resource2 then resource1  
    Thread t2 = new Thread() {  
      public void run() {  
        synchronized (resource2) {  
          System.out.println("Thread 2: locked resource 2");  
  
          try { Thread.sleep(100);} catch (Exception e) {}  
  
          synchronized (resource1) {  
            System.out.println("Thread 2: locked resource 1");    	//DeadLock 발생!
          }  
        }  
      }  
    };  
  
      
    t1.start();  
    t2.start();  
  }  
}

알다시피 두개의 쓰레드가 서로 잡은것을 안놓고 서로 상대가 가진 자원을 기다리고 있는 상태라면 Deadlock이 발생한다. 프로그램이 멈춘다..

 

* Thread 간에 동기화!

https://www.baeldung.com/java-wait-notify

 

간략하게 설명하면.. 

AThread: 데이터를 보낸다, 나 다 보냈어라고 신호를 준다.(notify) 그리고 기다림....

BThread: 데이터를 받는다, 나 다 받았어 라고 신호를 준다.(notify) 그리고 기다림....

 

public class Test1 {

	public class Data{
		private String packet;		// 공유데이터
		
		public synchronized void send(String packet){
			this.packet = packet;	// 데이터를 넣는다.
			notifyAll();				// 공유 자원에 데이터를 넣었다는것을 알려준다.	

			try {
				wait();
			} catch (InterruptedException e) {
				// ignored..		// 데이터를 다 읽어갈때까지 기다린다..
			}

		}
		
		public synchronized String receive(){
			String tmpPacket = "";
			try {
				wait();					
			} catch (InterruptedException e) {
				// ignored..
			}
			tmpPacket = new String (this.packet);
			notifyAll();				// 깨어나서 다시 데이터를 보내주라!
			return tmpPacket;		// 위 쓰레드에서 넣은 공유데이터를 가져와서 반환한다.

		}
	}
	
	public class Sender implements Runnable{
		private Data data;
		public Sender(Data data) {
			this.data = data;
		}
		@Override
		public void run() {
			String packetData[] = {
				"test1",
				"test2",
				"test3",
				"end"
			};
			for(String str : packetData){
				data.send(str);
			}
			
		}
	}
	
	public class Receiver implements Runnable{
		private Data data;
		public Receiver(Data data) {
			this.data = data;
		}
		@Override
		public void run() {
			String rcvData = "";
			while(!"end".equals(rcvData)){
				rcvData = data.receive();					
				System.out.println(rcvData);
			}
		}
	}
  public static void main(String[] args) { 
	  Test1 t1 = new Test1();
	   Data data =  t1.new Data();
	   Thread sender = new Thread(t1.new Sender(data));
	   Thread receiver = new Thread(t1.new Receiver(data));
	    
	   sender.start();
	   receiver.start();
}// main  
}

 

가짜로 깨어나는 경우도 있다.

http://tutorials.jenkov.com/java-concurrency/thread-signaling.html

 

Thread Signaling

This tutorial explains how threads in Java can send signals to each other, for instance indicating that some action is finished, or that a new object is ready for processing.

tutorials.jenkov.com

 

댓글