Concurrency and Source Panels
Atomic Ticket
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.