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.