Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

Concurrent programming 2

코딩 소림사 스터디 ppt

  • Loggen Sie sich ein, um Kommentare anzuzeigen.

Concurrent programming 2

  1. 1. concurrent Programming #2 코딩소림사 강병수
  2. 2. 지난시간 복습 • 현대 컴퓨팅 환경은 동시성 제어가 필수다. • 동시성 제어의 핵심은 동기화 처리이다. • mutex • semaphore • spin lock • kernel level vs user level • atomic operation • test and set • compare and swap • fetch and add • ABA problem
  3. 3. 이번시간에는 • 많은 사람들의 주력 언어인 java 구현체를 알아봅시다. • synchronized vs lock • Runnable vs Callable • ExecutorService / thread pool • Future • 왜 멀쩡한 oop 를 놔두고 functional programming을 해야 하나? • concurrent programming 을 잘하기 위해서입니다.
  4. 4. java synchronized • 인터넷에 아주 좋은 글이 있더라고요! • https://01010011.blog/2017/01/20/java-synchronization-internal/ • synchronized 에는 2가지 종류가 있다. • synchronized method • synchronized block
  5. 5. synchronized method vs synchronized block • 관련 java spec 은 여기를 참조 • synchronized method • https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.3.6 • synchronized block(=synchronized statement) • https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.19 • monitorenter • https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms- 6.5.monitorenter • monitorexit • https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms- 6.5.monitorexit
  6. 6. • 차이? • critical section 의 범위를 선택할 수 있다/없다 • bytecode compile 결과물이 다르다. • biased lock 적용 여부가 다르다. synchronized method vs synchronized block • jvm 구현(openjdk 기준)까지 내려가 보면 둘 다 mutex 입니다.
  7. 7. • 차이? • critical section 의 범위를 선택할 수 있다/없다 synchronized method vs synchronized block Bar bar = new Bar(); public void foo() { … syhchronized(bar) { … } … } public void synchronized foo() { … } vs
  8. 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. 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. 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. 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만 접근하도록 허용
  12. 12. 그밖에 동기화 • transactional memory • volatile • double checked lock • 숙제 : 뭔지 알아오기
  13. 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. 14. Runnable vs Callable • Callable • Executor / ExecutorService / Future 와 항상 함께 쓰임 • ExecutorService가 Executor 를 만들고 • Executor 가 Callable 을 실행하고 • Future 가 결과를 받는다. • 숙제 : Future? • asynchronous / blocking • sync / async , blocking / non-blocking 의 차이점은? • CompletableFuture 는?
  15. 15. Why Functional? • thread safety 를 만족하는 4가지 상황이 뭐였죠?
  16. 16. thread safety • 모든 thread safety 문제는 공유되는 리소스 간 동기화 문제 • 다음 4가지 상황을 만족하면 thread safe • 공유 리소스 없다 • 공유 리소스 있다 & immutable • 공유 리소스 있다 & critical section 에 대한 동기화 보장 • 공유 리소스 있다 & atomic operation 현재 functional programming이 각광받는 이유 • lock 없다 -> 빠르다 • thread safe 하다 -> multi core computing
  17. 17. 결정할 사항 • 정기 세미나 누가? 무슨 주제로? • 누가 : • 무슨 주제로 : • RxJava 책 스터디 • 책 : • http://www.acornpub.co.kr/book/rxjava-essentials • http://shop.oreilly.com/product/0636920042228.do • 발표자 • 1주 : • 2주 : • 2주로 끝낼 수 있도록 • 발표자 외에 나머지 사람도 준비를 많이 해 주세요

×