Kotlin
[코틀린 코딩 습작] Future
[하마] 이승현 (wowlsh93@gmail.com)
2021. 5. 15. 19:06
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를 하게된 메인 쓰레드를 깨워줄 시그널은 없게 된다.