23.7. Adnotacja volatile

Adnotacja volatile jest odpowiednikiem słowa kluczowego volatile języka Java. Program z pliku VolatileTest1.scala dokonuje wielokrotnej aktualizacji zmiennej x typu Long (wiersz ) wartościami 1 i -1. Oprócz dokonywania aktualizacji, program sprawdza, czy wartość tej zmiennej jest równa jednej z prawidłowych wartości, a więc albo 1, albo -1. W przypadku odczytu innej wartości wyświetlany jest na ekranie komunikat.

Plik VolatileTest1.scala:
object VolatileTest1 {
  var x: Long = 1L
  class UpdateThread(a: Long, b: Long) extends Thread {
      override def run {
        var k = 0
        while(k < 10000000){
          if (x != a && x != b) println("Wrong x value!")
          x = a
          k += 1
        }
      }
    }
  def main(args: Array[String]) {
    val t1 = new UpdateThread(1L,-1L)
    val t2 = new UpdateThread(-1L,1L)
    t1.start; t2.start
    t1.join; t2.join
  }
}

Po uruchomieniu programu okazuje się, że zdarzają się sytuacje, w których wartość zmiennej x jest nieprawidłowa.

$ scala VolatileTest1
Wrong x value!

$ scala VolatileTest1
Wrong x value!
Wrong x value!
Wrong x value!
…

Program z pliku VolatileTest2.scala jest podobny do poprzedniego, przy czym zmienna x jest w tym programie opatrzona adnotacją volatile.

Plik VolatileTest2.scala:
object VolatileTest2 {
  @volatile var x: Long = 1L
  class UpdateThread(a: Long, b: Long) extends Thread {
      override def run {
        var k = 0
        while(k < 10000000){
          if (x != a && x != b) println("Wrong x value!")
          x = a
          k += 1
        }
      }
    }
  def main(args: Array[String]) {
    val t1 = new UpdateThread(1L,-1L)
    val t2 = new UpdateThread(-1L,1L)
    t1.start; t2.start
    t1.join; t2.join
  }
}

Próby uruchomienia programu nie wykazują istnienia innych, niż prawidłowe wartości zmiennej x.

$ scala VolatileTest2

$ scala VolatileTest2

$ scala VolatileTest2

$

Język programowania Scala Wydanie 2. Copyright © Grzegorz Balcerek 2016

Licencja Creative Commons

Ten utwór jest dostępny na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowe.

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.