frozenঢ়ଶ?
• ͦͷΠϯελϯε͕immutableͰ͋Δ͜ͱΛอূ͢Δ
/**
* Freezes object subgraph reachable from this object. Frozen objects can be freely
* shared between threads/workers.
*
* @throws FreezingException if freezing is not possible
* @return the object itself
* @see ensureNeverFrozen
*/
public fun T.freeze(): T
frozenঢ়ଶ?
• ͦͷΠϯελϯε͕immutableͰ͋Δ͜ͱΛอূ͢Δ
• freezeͨ͠ΠϯελϯεΛมߋ͠Α͏ͱ͢ΔͱɺΫϥογϡ͢Δ
• ଞͷεϨουͱ҆શʹڞ༗͢Δ͜ͱ͕ग़དྷΔ
/**
* Checks if given object is null or frozen or permanent (i.e. instantiated at compile-time).
*
* @return true if given object is null or frozen or permanent
*/
public val Any
?.
isFrozen
val worker = Worker.start()
worker.execute(TransferMode.SAFE, { … }) {
…
}
public fun execute(
mode: TransferMode,
producer: ()
->
T1,
@VolatileLambda job: (T1)
-
>
T2
): Future
Slide 23
Slide 23 text
data class Sample(var i: Int)
val sample = Sample(1)
Slide 24
Slide 24 text
data class Sample(var i: Int)
val sample = Sample(1)
worker.execute(TransferMode.SAFE, { sample }) {
println(it)
}
Slide 25
Slide 25 text
data class Sample(var i: Int)
val sample = Sample(1)
worker.execute(TransferMode.SAFE, { sample }) {
println(it)
}
Uncaught Kotlin exception: kotlin.IllegalStateException: Illegal transfer state
Slide 26
Slide 26 text
data class Sample(var i: Int)
val sample = Sample(1)
worker.execute(TransferMode.SAFE, { sample.freeze() }) {
println(it)
}
Slide 27
Slide 27 text
data class Sample(var i: Int)
val sample = Sample(1)
val sample2 = Sample(2)
Slide 28
Slide 28 text
data class Sample(var i: Int)
val sample = Sample(1)
val sample2 = Sample(2)
worker.execute(TransferMode.SAFE, { sample.freeze() }) {
println(it)
}
Slide 29
Slide 29 text
data class Sample(var i: Int)
val sample = Sample(1)
val sample2 = Sample(2)
fun background(block: ()
->
Unit) {
worker.execute(TransferMode.SAFE, { block.freeze() }) {
it()
}
}
Slide 30
Slide 30 text
data class Sample(var i: Int)
val sample = Sample(1)
val sample2 = Sample(2)
background {
println(sample)
println(sample2)
}
fun background(block: ()
->
Unit) {
worker.execute(TransferMode.SAFE, { block.freeze() }) {
it()
}
}
Slide 31
Slide 31 text
data class Sample(var i: Int)
val sample = Sample(1)
val sample2 = Sample(2)
background {
println(sample)
println(sample2)
}
fun background(block: ()
->
Unit) {
worker.execute(TransferMode.SAFE, { block.freeze() }) {
it()
}
}
sampleɺsample2ຊମΛfreeze͍ͯ͠ͳ͍
εϨου͕มΘΔ߹ɺfreeze͠ͳ͍ͱ͍͚ͳ͍ͷͰ?
Slide 32
Slide 32 text
data class Sample(var i: Int)
val sample = Sample(1)
val sample2 = Sample(2)
background {
println(sample)
println(sample2)
}
fun background(block: ()
->
Unit) {
worker.execute(TransferMode.SAFE, { block.freeze() }) {
it()
}
}
sampleɺsample2ຊମΛfreeze͍ͯ͠ͳ͍
εϨου͕มΘΔ߹ɺfreeze͠ͳ͍ͱ͍͚ͳ͍ͷͰ?
ϥϜμຊମΛfreeze͢Δͱɺ
ͦͷϥϜμ͕ࢀর͍ͯ͠Δม࿈తʹfreeze͞ΕΔ