Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 안드로이드 웹뷰
- 스칼라
- Akka
- 하이브리드앱
- 엔터프라이즈 블록체인
- 파이썬 강좌
- 스칼라 강좌
- hyperledger fabric
- play 강좌
- 주키퍼
- 파이썬 데이터분석
- 플레이프레임워크
- play2 강좌
- Golang
- Play2 로 웹 개발
- 그라파나
- Hyperledger fabric gossip protocol
- CORDA
- 하이퍼레저 패브릭
- Adapter 패턴
- Actor
- 스위프트
- 블록체인
- Play2
- 파이썬
- 이더리움
- 스칼라 동시성
- 파이썬 머신러닝
- akka 강좌
- 파이썬 동시성
Archives
- Today
- Total
HAMA 블로그
[코틀린 코딩 습작] Future 본문
import jdk.nashorn.internal.ir.Block
import java.util.concurrent.locks.ReentrantLock
import kotlin.concurrent.thread
import kotlin.concurrent.withLock
class Future {
lateinit var result: String
var isDone = false
val lock = ReentrantLock()
val condition = lock.newCondition()
fun get() : String {
if(isDone) return result // (1)
lock.withLock {
condition.await()
}
return result
}
fun set(result: String) {
lock.withLock {
this.result = result
this.isDone = true
condition.signalAll()
}
}
}
class Work {
fun doSomething(): Future {
val future = Future()
thread(start = true, name = "mythread1") {
Thread.sleep(3000)
future.set("ok")
}
return future;
}
}
fun main() {
println ("================= start ================")
val work = Work()
val future = work.doSomething()
Thread.sleep(5000)
val result = future.get()
println("result: ${result}")
}
Future패턴의 구현이다.
위의 (1) 번 주석의 코드가 왜 필요한지 생각해보자.
저것을 안하면 어떻게 될 까?
그렇게 되면 이 코드는 데드락이 걸린다.
set()을 먼저하게 되는데, 이때 condition.signalAll을 해서 await된 메인 쓰레드를 깨우려고 해바짜, 메인쓰레드 진입전이기 때문에 헛수고가 되버리며, 5초 후에 get이 들어오고 나서 await를 하게된 메인 쓰레드를 깨워줄 시그널은 없게 된다.
'Kotlin' 카테고리의 다른 글
[코틀린 코딩 습작] Visitor (0) | 2021.05.20 |
---|---|
[코틀린 코딩 습작] Intercepting Fillter (0) | 2021.05.15 |
[코틀린 코딩 습작] Annotation & Reflection (0) | 2021.05.15 |
[코틀린 코딩 습작] Double Dispatch (0) | 2021.05.15 |
[코틀린 코딩 습작] recursive types bound (0) | 2021.05.11 |
Comments