Concurrency and Source Panels
Synchronized Counter
Protect a shared counter with Kotlin's synchronized block.
Synchronized Counter
SynchronizedCounter.kt
fun addTwice(lock: Any, counter: IntArray, amount: Int) {
repeat(2) {
synchronized(lock) {
counter[0] += amount
}
}
}
fun main() {
val amount =
val lock = Any()
val counter = IntArray(1)
val left = Thread { addTwice(lock, counter, amount) }
val right = Thread { addTwice(lock, counter, amount) }
left.start()
right.start()
left.join()
right.join()
println("amount=$amount")
println("counter=${counter[0]}")
}
fun addTwice(lock: Any, counter: IntArray, amount: Int) {
repeat(2) {
synchronized(lock) {
counter[0] += amount
}
}
}
fun main() {
val amount =
val lock = Any()
val counter = IntArray(1)
val left = Thread { addTwice(lock, counter, amount) }
val right = Thread { addTwice(lock, counter, amount) }
left.start()
right.start()
left.join()
right.join()
println("amount=$amount")
println("counter=${counter[0]}")
}
fun addTwice(lock: Any, counter: IntArray, amount: Int) {
repeat(2) {
synchronized(lock) {
counter[0] += amount
}
}
}
fun main() {
val amount =
val lock = Any()
val counter = IntArray(1)
val left = Thread { addTwice(lock, counter, amount) }
val right = Thread { addTwice(lock, counter, amount) }
left.start()
right.start()
left.join()
right.join()
println("amount=$amount")
println("counter=${counter[0]}")
}
synchronized block
`synchronized(lock)` lets only one thread run the protected block at a time, so each increment sees a stable counter value.