Concurrency and Source Panels
Atomic Ticket
Issue unique ticket numbers from two threads with AtomicInteger.
Atomic Ticket
AtomicTicket.scala
import java.util.concurrent.atomic.AtomicInteger
object Main {
val next = new AtomicInteger(0)
var firstTicket = 0
var secondTicket = 0
def firstWork(): Unit = {
firstTicket = next.getAndIncrement()
}
def secondWork(): Unit = {
secondTicket = next.getAndIncrement()
}
def main(args: Array[String]): Unit = {
val start =
next.set(start)
val first = Thread(() => firstWork())
val second = Thread(() => secondWork())
first.start()
second.start()
first.join()
second.join()
val low = Math.min(firstTicket, secondTicket)
val high = Math.max(firstTicket, secondTicket)
println("start=" + start)
println("tickets=" + low + "," + high)
}
}
import java.util.concurrent.atomic.AtomicInteger
object Main {
val next = new AtomicInteger(0)
var firstTicket = 0
var secondTicket = 0
def firstWork(): Unit = {
firstTicket = next.getAndIncrement()
}
def secondWork(): Unit = {
secondTicket = next.getAndIncrement()
}
def main(args: Array[String]): Unit = {
val start =
next.set(start)
val first = Thread(() => firstWork())
val second = Thread(() => secondWork())
first.start()
second.start()
first.join()
second.join()
val low = Math.min(firstTicket, secondTicket)
val high = Math.max(firstTicket, secondTicket)
println("start=" + start)
println("tickets=" + low + "," + high)
}
}
import java.util.concurrent.atomic.AtomicInteger
object Main {
val next = new AtomicInteger(0)
var firstTicket = 0
var secondTicket = 0
def firstWork(): Unit = {
firstTicket = next.getAndIncrement()
}
def secondWork(): Unit = {
secondTicket = next.getAndIncrement()
}
def main(args: Array[String]): Unit = {
val start =
next.set(start)
val first = Thread(() => firstWork())
val second = Thread(() => secondWork())
first.start()
second.start()
first.join()
second.join()
val low = Math.min(firstTicket, secondTicket)
val high = Math.max(firstTicket, secondTicket)
println("start=" + start)
println("tickets=" + low + "," + high)
}
}
atomic-update
Atomic types make a read-modify-write operation indivisible, so each thread receives a distinct ticket number.