1.CyclicBarrier 클래스
await()이 불린만큼 생성자안의 넘버가 한개씩 줄어들고.
넘버==0 이되면 메소드를 수행한다.
2. 나의 경우
메인메서드에서 일단 한번 await() 걸어서. 얘 혼자 스택 못끝내게 만들어놓고.
100개의 스레드 다 만들어져서 await()이 총 101번 걸리면 그때 한꺼번에 호출!
그렇게 함으로써 total elapsed time을 구할 수 있도록 한다!
await() 이 불릴때마다 카운트가 -1 씩 줄어들고
0이 되면 runnable 의 run()호출함을 확인할 수 있음.
번외) AtomicInteger , AtomicLong클래스
Synchronized 키워드는 기본적으로 비관적 잠금이다.
동기화 이슈는 확률적으로 매우 작게 일어나긴 하지만 , 일단 잠가놓고 본다.
그렇지만 Atomic~~클래스는 낙관적잠금을 한다.
일단 공유되어질수있고, 해당 공유되어진 값에 차이가 날경우 롤백?보완?잠금?하는 방식이라고한다. 따라서 성능면에서 더 좋다.
아토믹하다, 원자적이라는 것은 더이상 쪼갤수없다는 것.
이를 테면 원자적 연산이란 = 더이상 쪼갤수없는 연산, 한번에 처리될 수 있는 연산을 의미한다.
int a = 0은 원자적 연산이다.
하지만 a++ 은 원자적 연산이 아니다.
int a = 0 을 살펴보면
a 를 로드한다(4바이트) & 0을 로드한다(4바이트) & a에 0을 대입한다 => 컴퓨터가 원자적으로 처리할수있다.
하지만 a ++은어떨까?
a = a+ 1 이므로
더하는 과정에서 연산이 쪼개진다.(?)
그리고 a가 int 가 아니라. long일경우에도! 8바이트가 되어서 연산이 쪼개진다고 함.
더 공부해야징~~
댓글 없음:
댓글 쓰기