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.