Issue unique ticket numbers from multiple threads with AtomicInteger.

Atomic Ticket

AtomicTicket.kt
import java.util.concurrent.atomic.AtomicInteger

fun issueTicket(next: AtomicInteger, issued: MutableList<Int>, lock: Any) {
    val ticket = next.getAndIncrement()
    synchronized(lock) {
        issued.add(ticket)
    }
}

fun main() {
    val start = 
    val next = AtomicInteger(start)
    val issued = mutableListOf<Int>()
    val lock = Any()

    val first = Thread { issueTicket(next, issued, lock) }
    val second = Thread { issueTicket(next, issued, lock) }

    first.start()
    second.start()
    first.join()
    second.join()

    issued.sort()
    println("start=$start")
    println("issued=${issued.joinToString(",")}")
}
import java.util.concurrent.atomic.AtomicInteger

fun issueTicket(next: AtomicInteger, issued: MutableList<Int>, lock: Any) {
    val ticket = next.getAndIncrement()
    synchronized(lock) {
        issued.add(ticket)
    }
}

fun main() {
    val start = 
    val next = AtomicInteger(start)
    val issued = mutableListOf<Int>()
    val lock = Any()

    val first = Thread { issueTicket(next, issued, lock) }
    val second = Thread { issueTicket(next, issued, lock) }

    first.start()
    second.start()
    first.join()
    second.join()

    issued.sort()
    println("start=$start")
    println("issued=${issued.joinToString(",")}")
}
import java.util.concurrent.atomic.AtomicInteger

fun issueTicket(next: AtomicInteger, issued: MutableList<Int>, lock: Any) {
    val ticket = next.getAndIncrement()
    synchronized(lock) {
        issued.add(ticket)
    }
}

fun main() {
    val start = 
    val next = AtomicInteger(start)
    val issued = mutableListOf<Int>()
    val lock = Any()

    val first = Thread { issueTicket(next, issued, lock) }
    val second = Thread { issueTicket(next, issued, lock) }

    first.start()
    second.start()
    first.join()
    second.join()

    issued.sort()
    println("start=$start")
    println("issued=${issued.joinToString(",")}")
}
atomic update Atomic types make a read-modify-write operation indivisible, so each thread receives a distinct ticket number.