Joyful Project/java

synchronized

deity4u 2010. 5. 17. 21:00

method 앞에 붙는 synchonized 는 예약어로써 실제적인 의미는 this를 sync 잡고 내용을 수행하는 것과 동일합니다. 즉,

synchronized void method() { ... }



void method() { sychronized(this) { ... } }

 

로 사용합니다.

대부분 synchronized 에서는 함수명쪽에다가 적어주는 경우도 있긴 한데, 함수가 좀 길다든지 혹은 sync 때문에 생기는 지연시간등을 더 줄이고 싶은 경우 아래의 경우를 사용하기도 합니다.

하지만 스케줄링에 관련된 내용으로 인해 첫번째 메쏘드의 수행속도가 조금 빠릅니다. (instruction code 상으로 좀더 간단합니다)

기능은 현재 실행중인 객체 중 client 를 먼저 lock 한 객체 또는 코드만이 실행되고 나머지는 대기한다는 이야기입니다.

다 비슷한 말들이지만 자바에서는 이러한 것들을 lock, unlock 한다고 하지요.
생성되는 모든 객체들은 lock/unlock 을 위한 고유하고 유일한 토큰이 있구요...
따라서 이 토큰을 갖고 있는 객체만이 해당 synchronized로 된 critical section에 접근할 수가 있습니다.
lock/unlock 은 자동으로 JVM에 의해서 발생하는 것이니까 신경쓸 필요는 없는거구요.

말씀하신것처럼 변수(Vector client)가 조건이라고 한다면, 해당 코드가 실행되는 시점에서 Vector 객체인 client 의 토큰을 가장 먼저 취한 객체가 되겠지요.

그리고 혹시나 해서 언급을 하는건데, 만약에 Vector 에 대해서 단일한 추가/삭제를 하실거라면 synchroinzed는 할 필요없습니다. 아시다시피 Vector 또는 Hashtable은 메소드들에 synchroinzed가 되어있는 것들이기 때문이지요.

만약 synchroinzed 를 쓰실거라면 Vector 대신에 ArrayList 같은것들을 써보는건 어떨까요? ArrayList나 HashMap 등은 synchronized 처리가 안되어 있기 때문에 실행성능면에서는 조금 더 빠릅니다.
synchroinzed 된 것들으 한번 더 synchroinzed 로 묶어서 사용하는것보다는 아무래도 수행성능상의 잇점이 조금이라도 있을거라 생각합니다.