강좌/JAVA THREAD2013. 4. 12. 15:29

동기화를 배울때 synchronized와 volatile을 공부했다.

synchronized는 메소드 시그니쳐나 블럭(?)을 지정할때 volatile은 변수에 대한 동기화였다.


아래 예제를 보자.

예제는 백만까지 for루프를 돌면서 합계를 구하는 것이다.


위의 예제를 돌려보면 결과값이 499999500000 나온다(백만의 합계이다) 

걸린 시간은 대략 컴퓨터에 따라 다르지만 내 컴퓨터 기준으로는 32ms 다.(내 컴이 꾸리다)


그럼 쓰레드를 두개 생성후 돌리면 어떻게 될까?

499999500000 * 2 = 999999000000 가 나와야 하지 않을까?

근데 아니다.


가끔씩 값이 다르게 나온다.(아래처럼)

이유는 아무리 변수에 대한 volatile처리를 했어도 add메소드에서 동시에 두개가 작업이 들어가면서

값이 틀리게 나오는것이다.




그럼 어떻게 해야 될까? 이럴때 synchronized를 add메소드에다 붙이면 된다. 아래처럼

결과는 아래처럼 나온다...합계도 정상이다 계속 돌려도..근데 시간을 보자..시간이 처음보다 엄청 걸린다.

이게 바로 synchronized의 단점이다. 써야 할땐 써야 하지만 시간이 너무 걸리다.


이걸 해결하기 위해서 자바5 버전 이후 부터는 Atomic이라는 클래스를 사용한다.

AtomicLong이라는 클래스를 선언후 add메소드에서 addAndGet이라는 메소드를 사용 하면 된다.

그 외에는 다 똑같다. 물론 synchronized와 volatile은 지웠다.


결과를 보자 거의 5배 이상 빨라졌다..



Posted by 방랑자 이번엔제대로

댓글을 달아 주세요