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

Mais conteúdo relacionado

Mais procurados

공성대전 C# 사용기
공성대전 C# 사용기공성대전 C# 사용기
공성대전 C# 사용기
Myoung-gyu Gang
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
min woog kim
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
QooJuice
 
함수형 프로그래밍
함수형 프로그래밍함수형 프로그래밍
함수형 프로그래밍
QooJuice
 

Mais procurados (20)

병렬 프로그래밍
병렬 프로그래밍병렬 프로그래밍
병렬 프로그래밍
 
공성대전 C# 사용기
공성대전 C# 사용기공성대전 C# 사용기
공성대전 C# 사용기
 
Tcp ip & io model
Tcp ip & io modelTcp ip & io model
Tcp ip & io model
 
신규 협업도구 사용자 교육(공통 비개발자)
신규 협업도구 사용자 교육(공통 비개발자)신규 협업도구 사용자 교육(공통 비개발자)
신규 협업도구 사용자 교육(공통 비개발자)
 
[NDC 2016] 유니티, iOS에서 LINQ 사용하기
[NDC 2016] 유니티, iOS에서 LINQ 사용하기[NDC 2016] 유니티, iOS에서 LINQ 사용하기
[NDC 2016] 유니티, iOS에서 LINQ 사용하기
 
Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표
 
게임서버프로그래밍 #1 - IOCP
게임서버프로그래밍 #1 - IOCP게임서버프로그래밍 #1 - IOCP
게임서버프로그래밍 #1 - IOCP
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
 
포스트모템디버깅과 프로세스 덤프 실전
포스트모템디버깅과 프로세스 덤프 실전포스트모템디버깅과 프로세스 덤프 실전
포스트모템디버깅과 프로세스 덤프 실전
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
 
함수형 프로그래밍
함수형 프로그래밍함수형 프로그래밍
함수형 프로그래밍
 
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
 
[120316] node.js 프로그래밍 5장
[120316] node.js 프로그래밍 5장[120316] node.js 프로그래밍 5장
[120316] node.js 프로그래밍 5장
 
Iocp 기본 구조 이해
Iocp 기본 구조 이해Iocp 기본 구조 이해
Iocp 기본 구조 이해
 
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
 
More Effective Python 3st (Multitask)
More Effective Python 3st (Multitask)More Effective Python 3st (Multitask)
More Effective Python 3st (Multitask)
 
Asynchronous 101 (2)
Asynchronous 101 (2)Asynchronous 101 (2)
Asynchronous 101 (2)
 
Windows reversing study_basic_2
Windows reversing study_basic_2Windows reversing study_basic_2
Windows reversing study_basic_2
 

Destaque

Destaque (16)

Exception log practical_coding_guide, 예외와 로그 코딩 실용 가이드
Exception log practical_coding_guide, 예외와 로그 코딩 실용 가이드Exception log practical_coding_guide, 예외와 로그 코딩 실용 가이드
Exception log practical_coding_guide, 예외와 로그 코딩 실용 가이드
 
예외처리가이드
예외처리가이드예외처리가이드
예외처리가이드
 
코딩소림사 Rx java
코딩소림사 Rx java코딩소림사 Rx java
코딩소림사 Rx java
 
Dependency hell과 빌드지옥 탈출
Dependency hell과 빌드지옥 탈출Dependency hell과 빌드지옥 탈출
Dependency hell과 빌드지옥 탈출
 
생각이라는 벽돌로 만드는 집
생각이라는 벽돌로 만드는 집생각이라는 벽돌로 만드는 집
생각이라는 벽돌로 만드는 집
 
Oscon keynote: Working hard to keep it simple
Oscon keynote: Working hard to keep it simpleOscon keynote: Working hard to keep it simple
Oscon keynote: Working hard to keep it simple
 
[패스트캠퍼스] 데이터 사이언스 스쿨 조용환_영화 관객수 예측 시스템
[패스트캠퍼스] 데이터 사이언스 스쿨 조용환_영화 관객수 예측 시스템[패스트캠퍼스] 데이터 사이언스 스쿨 조용환_영화 관객수 예측 시스템
[패스트캠퍼스] 데이터 사이언스 스쿨 조용환_영화 관객수 예측 시스템
 
AlphaYak :: Artificially Intelligent Pharmacist Chatbot
AlphaYak :: Artificially Intelligent Pharmacist ChatbotAlphaYak :: Artificially Intelligent Pharmacist Chatbot
AlphaYak :: Artificially Intelligent Pharmacist Chatbot
 
Fluenty(김강학 대표)_AI Startup D.PARTY_20161020
Fluenty(김강학 대표)_AI Startup D.PARTY_20161020Fluenty(김강학 대표)_AI Startup D.PARTY_20161020
Fluenty(김강학 대표)_AI Startup D.PARTY_20161020
 
알파고 해부하기 2부
알파고 해부하기 2부알파고 해부하기 2부
알파고 해부하기 2부
 
Helpful Review Recommendation (리뷰 추천시스템)
Helpful Review Recommendation (리뷰 추천시스템)Helpful Review Recommendation (리뷰 추천시스템)
Helpful Review Recommendation (리뷰 추천시스템)
 
Naive bayes model을 활용한 영화 별점 예측 시스템
Naive bayes model을 활용한 영화 별점 예측 시스템Naive bayes model을 활용한 영화 별점 예측 시스템
Naive bayes model을 활용한 영화 별점 예측 시스템
 
마이크로서비스 아키텍처로 개발하기
마이크로서비스 아키텍처로 개발하기마이크로서비스 아키텍처로 개발하기
마이크로서비스 아키텍처로 개발하기
 
마인즈랩 회사소개서 V2.3_한국어버전
마인즈랩 회사소개서 V2.3_한국어버전마인즈랩 회사소개서 V2.3_한국어버전
마인즈랩 회사소개서 V2.3_한국어버전
 
Django View Part 1
Django View Part 1Django View Part 1
Django View Part 1
 
Slackbot with Python
Slackbot with PythonSlackbot with Python
Slackbot with Python
 

Semelhante a Concurrent programming 2

Java8 - Oracle Korea Magazine
Java8 - Oracle Korea MagazineJava8 - Oracle Korea Magazine
Java8 - Oracle Korea Magazine
Jay Lee
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&C
sys4u
 

Semelhante a Concurrent programming 2 (20)

Concurreny programming
Concurreny programmingConcurreny programming
Concurreny programming
 
댓글 플러그인 아포가토
댓글 플러그인 아포가토댓글 플러그인 아포가토
댓글 플러그인 아포가토
 
Java 8 & Beyond
Java 8 & BeyondJava 8 & Beyond
Java 8 & Beyond
 
Concurrent Programming (Java thread 다루기)
Concurrent Programming (Java thread 다루기)Concurrent Programming (Java thread 다루기)
Concurrent Programming (Java thread 다루기)
 
Node.js 기본
Node.js 기본Node.js 기본
Node.js 기본
 
AngularJS In Production
AngularJS In ProductionAngularJS In Production
AngularJS In Production
 
[H3 2012] Bridge over troubled water : make plug-in for Appspresso
[H3 2012] Bridge over troubled water : make plug-in for Appspresso[H3 2012] Bridge over troubled water : make plug-in for Appspresso
[H3 2012] Bridge over troubled water : make plug-in for Appspresso
 
파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥
파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥
파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥
 
manage inhouse openstack the hard way(kakao case study about 10,000 vms)
manage inhouse openstack the hard way(kakao case study about 10,000 vms)manage inhouse openstack the hard way(kakao case study about 10,000 vms)
manage inhouse openstack the hard way(kakao case study about 10,000 vms)
 
Java8 - Oracle Korea Magazine
Java8 - Oracle Korea MagazineJava8 - Oracle Korea Magazine
Java8 - Oracle Korea Magazine
 
[2013.07.16] PythonKorea강남스터디 발표 - flask testing
[2013.07.16] PythonKorea강남스터디 발표 - flask testing[2013.07.16] PythonKorea강남스터디 발표 - flask testing
[2013.07.16] PythonKorea강남스터디 발표 - flask testing
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
 
자바9 특징 (Java9 Features)
자바9 특징 (Java9 Features)자바9 특징 (Java9 Features)
자바9 특징 (Java9 Features)
 
1st cardano korea_meetup
1st cardano korea_meetup1st cardano korea_meetup
1st cardano korea_meetup
 
Spring Framework - Inversion of Control Container
Spring Framework - Inversion of Control ContainerSpring Framework - Inversion of Control Container
Spring Framework - Inversion of Control Container
 
Java the good parts
Java the good partsJava the good parts
Java the good parts
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&C
 
Learning Laravel
Learning LaravelLearning Laravel
Learning Laravel
 
XECon2015 :: [1-2] 이현석 - Learning Laravel
XECon2015 :: [1-2] 이현석 - Learning LaravelXECon2015 :: [1-2] 이현석 - Learning Laravel
XECon2015 :: [1-2] 이현석 - Learning Laravel
 
[제14회 JCO 컨퍼런스] 개발자를 위한 서버이중화 by JAVACAFE
[제14회 JCO 컨퍼런스] 개발자를 위한 서버이중화 by JAVACAFE  [제14회 JCO 컨퍼런스] 개발자를 위한 서버이중화 by JAVACAFE
[제14회 JCO 컨퍼런스] 개발자를 위한 서버이중화 by JAVACAFE
 

Mais de Byeongsu Kang (7)

Kotlin study #1
Kotlin study #1Kotlin study #1
Kotlin study #1
 
Kotlin study #0
Kotlin study #0Kotlin study #0
Kotlin study #0
 
Aws summit 2017 사내전파교육
Aws summit 2017 사내전파교육Aws summit 2017 사내전파교육
Aws summit 2017 사내전파교육
 
알고리즘2
알고리즘2알고리즘2
알고리즘2
 
알고리즘 문제해결전략 #1
알고리즘 문제해결전략 #1알고리즘 문제해결전략 #1
알고리즘 문제해결전략 #1
 
Rx java essentials
Rx java essentialsRx java essentials
Rx java essentials
 
개발자 환경 설정
개발자 환경 설정개발자 환경 설정
개발자 환경 설정
 

Concurrent programming 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. 이번시간에는 • 많은 사람들의 주력 언어인 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
  • 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. • 차이? • 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만 접근하도록 허용
  • 12. 그밖에 동기화 • transactional memory • volatile • double checked lock • 숙제 : 뭔지 알아오기
  • 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 는?
  • 15. Why Functional? • thread safety 를 만족하는 4가지 상황이 뭐였죠?
  • 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주로 끝낼 수 있도록 • 발표자 외에 나머지 사람도 준비를 많이 해 주세요