java2019. 9. 21. 14:47

Syncronized 목적 :

 

Thread Safe 언제 문제가 발생하는가?

-> 여러 쓰레드가 한 객체에 선언된 변수에 접근하는 경우

-> 단 메소드에서 인스턴스 변수를 "수정"하려 하는 때만 발생. 어떻게 

-> 메소드 자체를 syncronized로 선언 (syncronized method)

-> 특정 문장만 선언(syncronized statements) sycrhonized 블록을 사용

-> 참조해야할 변수가 여러 개 인 경우, 각 참조할 객체마다 다른 Syncronized block을 만들어 준다.

 

(예제 참조)

ex)


package com.test.testapplication;




public class TestApplication {
	
	
	public static void main(String [] args) {
			
		TestApplication test = new TestApplication();
		test.doTest();
	}
	
	
	
	//각 쓰레드에서 참조할 변수
	public int count ;
	public int timeCount ;
	
	private   void doTest() {

		count=0;
		
		ThreadSample t1= new ThreadSample("t1");
		ThreadSample t2= new ThreadSample("t2");
	
		t1.start();
		t2.start();
		
		
		/*
		 * try { Thread.sleep(10000); } catch (InterruptedException e) {
		 * 
		 * System.out.println( e.toString() ); e.printStackTrace(); }
		 */
		//tip : thread 종료를 기다리도록 join method 사용
		try {
			t1.join();
			t2.join();
		}catch(InterruptedException e ) {
			e.printStackTrace();
		}
		
		System.out.println("final count : " + count);
		System.out.println("final timecount : " + timeCount);
		
	}
	
	
	/*참조해야할 변수가 여러개일 경우 , 서로 다른 lock을 사용한다.*/
	private Object lock = new Object();
	private Object timeCountLock = new Object();
	
	class ThreadSample extends Thread{
		
		
		public ThreadSample(String name) {
			super(name);
			
		}
		@Override
		public void run() {
			
			
			
			int loop = 0;
			while( loop < 10) {
				++loop;
				synchronized(lock) {
					System.out.println( this.getName() + " run!"  + " count :  "+(count++));
				}
				synchronized(timeCountLock) {
					System.out.println( this.getName() + " run!"  + " timeCount :  "+(timeCount++));
				}
				
				try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
				
					System.out.println( e.toString() );
					e.printStackTrace();
				}
			}
			
		}
		/*
		 * @Override public void run() { synchronizedRun(); }
		 */
		
		
	}
	
	// 각 쓰레드에서 공통으로 참조하는 method에 synchronized 선언을 해준다. 
	public  synchronized void synchronizedRun() {
		
		int loop = 0;
		while( loop < 10) {
			++loop;
			System.out.println( getClass().getSimpleName() + " run!"  + " count :  "+(count++));
		
			try {
				Thread.sleep(200);
			} catch (InterruptedException e) {
			
				System.out.println( e.toString() );
				e.printStackTrace();
			}
		}
	}
}


'java' 카테고리의 다른 글

FileFilter , FileNameFilter interface  (0) 2019.09.21
Thread interrupt 및 getState 예제  (0) 2019.09.21
Thread Priority 와 Daemon Thread  (0) 2019.09.17
Runnable interface와 Thread class  (0) 2019.09.17
Simple HashSet 및 Iterator 사용 예제  (0) 2019.09.16
Posted by easy16