SSISO Community

시소당

collection에서의 동기화 방법

collection에서의  동기화  방법이  있다고  들었는데..

  

예를  들어  ArrayList에서는

List  AccountList  =  Collections.synchronizedList(new  ArrayList());

이렇게  하라고  들었는데  단순히  이렇게  하면  해당  리스트에  대해  동기화가  되는지  궁금합니다...

그런데  자바  API문서를  보면

  synchronized(list)  {
            Iterator  i  =  list.iterator();  //  Must  be  in  synchronized  block
            while  (i.hasNext())
                    foo(i.next());
    }
이부분도  있는데...동기화  하는데  어떤  기능을  하는지  알고  싶습니다..

제가  보기에는  단순히  블럭안에만  동기화  시키는거  같은데요...

  

그리고  간단히  ArrayList에대해  동기화  예제좀  만들어  주세요..


-----------------------------------------------------------------------------------------

Collections의  synchronizedList메서드는

받은  List  객체가  instanceof  RandomAccess  일  때

SynchronizedRandomAccessList  객체로  변환해서  반환하고

아닐  때는  SynchronizedList객체로  변환해서  반환합니다.

  

SynchronizedRandomAccessList  나  SynchronizedList는

SynchronizedList를  상속하는  클래스인데

SynchronizedList는  SynchronizedCollection를  상속하는  클래스입니다.

SynchronizedList는  생성시  부모인  SynchronizedCollection의  생성자를  호출하고

이  생성자는  mutax  =  this;라는  코드를  담고  있습니다.

mutax는  Object형  변수입니다.

  

이걸  말씀  드리는  이유는

SynchronizedList  클래스의

모든  메서드가  mutax를  통해

동기화되기  때문입니다.

  

자세히는  잘  모르겠으나  제  생각에  API  문서에  나오기를

"synchronizedList메서드로  부터  반환된  객체를  iterating  할  때는

좋게  말로할  때  니가  직접  동기화해야된다."(완역  ^^;)

라고  하는  것을  보면  iterator와  관련된  부분에  한해서

동기화가  따로  필요한  것으로  보입니다.

  

결론적으로,

Collections.synchronizedList메서드의  인수로  넣은  List는

동기화된  List가  되어  반환되는데

그  List를  iterating  할  때만

따로  사용자가  동기화를  해주어야  한다~  라는  것으로  보입니다.

출처  :  http://kin.naver.com/detail/detail.php?d1id=1&dir_id=10106&eid=CcNaEq3hw3stAKDGHqyJKYWVYQErZPkn&qb=wNq52SBjb2xsZWN0aW9u

1322 view

4.0 stars