2. 지난시간 복습
• 현대 컴퓨팅 환경은 동시성 제어가 필수다.
• 동시성 제어의 핵심은 동기화 처리이다.
• mutex
• semaphore
• spin lock
• kernel level vs user level
• atomic operation
• test and set
• compare and swap
• fetch and add
• ABA problem
3. 이번시간에는
• 많은 사람들의 주력 언어인 java 구현체를 알아봅시다.
• synchronized vs lock
• Runnable vs Callable
• ExecutorService / thread pool
• Future
• 왜 멀쩡한 oop 를 놔두고 functional programming을 해야 하나?
• concurrent programming 을 잘하기 위해서입니다.
4. java synchronized
• 인터넷에 아주 좋은 글이 있더라고요!
• https://01010011.blog/2017/01/20/java-synchronization-internal/
• synchronized 에는 2가지 종류가 있다.
• synchronized method
• synchronized block
6. • 차이?
• critical section 의 범위를 선택할 수 있다/없다
• bytecode compile 결과물이 다르다.
• biased lock 적용 여부가 다르다.
synchronized method vs synchronized block
• jvm 구현(openjdk 기준)까지 내려가 보면 둘 다 mutex 입니다.
7. • 차이?
• critical section 의 범위를 선택할 수 있다/없다
synchronized method vs synchronized block
Bar bar = new Bar();
public void foo() {
…
syhchronized(bar) {
…
}
…
}
public void synchronized foo() {
…
}
vs
8. public class SynchronizedExample {
public static void main(String[] args) {
Foo foo = new Foo();
synchronized (foo) {
++foo.foo;
}
methodFoo(foo);
}
static synchronized void methodFoo(Foo foo) {
++foo.foo;
}
static class Foo {
public int foo;
}
}
synchronized method vs synchronized block
• 차이?
• bytecode compile 결과물이 다르다.
L5
LINENUMBER 15 L5
ALOAD 1
DUP
ASTORE 2
MONITORENTER
L0
LINENUMBER 16 L0
ALOAD 1
DUP
GETFIELD SynchronizedExample$Foo.foo : I
ICONST_1
IADD
PUTFIELD SynchronizedExample$Foo.foo : I
L6
LINENUMBER 17 L6
ALOAD 2
MONITOREXIT
L1
GOTO L7
L2
FRAME FULL [[Ljava/lang/String; SynchronizedExample$Foo java/lang/Object] [java/lang/Throwable]
ASTORE 3
ALOAD 2
MONITOREXIT
L3
ALOAD 3
ATHROW
L7
퀴즈
왜 monitorexit 를 두번 할까?
9. // access flags 0x28
static synchronized methodFoo(LSynchronizedExample$Foo;)V
L0
LINENUMBER 23 L0
ALOAD 0
DUP
GETFIELD SynchronizedExample$Foo.foo : I
ICONST_1
IADD
PUTFIELD SynchronizedExample$Foo.foo : I
L1
LINENUMBER 24 L1
RETURN
public class SynchronizedExample {
public static void main(String[] args) {
Foo foo = new Foo();
synchronized (foo) {
++foo.foo;
}
methodFoo(foo);
}
static synchronized void methodFoo(Foo foo) {
++foo.foo;
}
static class Foo {
public int foo;
}
}
synchronized method vs synchronized block
• 차이?
• bytecode compile 결과물이 다르다.
monitorenter / monitorexit 가 없다.
나중에 bytecode interpreter 가 method 를 해석할 때
synchronized keyword 를 보고 lock 을 걸어준다.
10. synchronized method vs synchronized block
• 차이?
• biased lock 적용 여부가 다르다.
• biased lock?
• https://blogs.oracle.com/dave/entry/biased_locking_in_hotspot
• lock 을 단계별로 적용하여 성능을 향상시켜보려는 기법
• object header 에 방금 CS에 진입한 thread id 를 적어둔다.
• 아까 그놈이 다시 CS에 진입하면 biased lock(가라 락) 적용
• biased lock – short term lock – long term lock 순으로 적용
• java6 부터는 default enabled
• default enabled 니까 몰라도 되겠네?
11. ReentrantLock
• Lock interface 를 구현한 class는 다음 3가지 뿐이다.
• ReentrantLock
• ReentrantReadWriteLock.ReadLock
• ReentrantReadWriteLock.WriteLock
• 참조
• https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Lock.html
• Lock 이 synchronized 보다 좋은 점?
• 보다 디테일한 동기화 전략을 수립할 수 있다.
• read lock 과 write lock 을 구분
• read 상황 시, 여러 thread 가 동시 접근하도록 허용
• write 상황 시, 1 개의 thread만 접근하도록 허용
13. Runnable vs Callable
• Runnable
• java1.0 부터 함께하던 Thread 추상화
• 특정 use case 를 만족시키기 어려운 디자인
• thread 가 작업 완료 후 연산 결과를 전달해야 하는 경우
Runnable은 반드시 공유 리소스를 사용해야만 한다.
• thread 작업 완료 시점을 알기 위해 추가적인 노력이 필
요하다.
• Runnable vs Callable 뭐가 다르죠?
• return type
• void vs <V>
• throws Exception
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
@FunctionalInterface
public interface Callable<V> {
V call() throws Exception;
}
14. Runnable vs Callable
• Callable
• Executor / ExecutorService / Future 와 항상 함께 쓰임
• ExecutorService가 Executor 를 만들고
• Executor 가 Callable 을 실행하고
• Future 가 결과를 받는다.
• 숙제 : Future?
• asynchronous / blocking
• sync / async , blocking / non-blocking 의 차이점은?
• CompletableFuture 는?
16. thread safety
• 모든 thread safety 문제는 공유되는 리소스 간 동기화 문제
• 다음 4가지 상황을 만족하면 thread safe
• 공유 리소스 없다
• 공유 리소스 있다 & immutable
• 공유 리소스 있다 & critical section 에 대한 동기화 보장
• 공유 리소스 있다 & atomic operation
현재 functional programming이 각광받는 이유
• lock 없다 -> 빠르다
• thread safe 하다 -> multi core computing
17. 결정할 사항
• 정기 세미나 누가? 무슨 주제로?
• 누가 :
• 무슨 주제로 :
• RxJava 책 스터디
• 책 :
• http://www.acornpub.co.kr/book/rxjava-essentials
• http://shop.oreilly.com/product/0636920042228.do
• 발표자
• 1주 :
• 2주 :
• 2주로 끝낼 수 있도록
• 발표자 외에 나머지 사람도 준비를 많이 해 주세요