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 $