Тема: ключове слово volatile

Доброго дня! Наведіть, будь ласка, приклад використання ключового слова volatile. Дякую!

2 Востаннє редагувалося 0xDADA11C7 (07.06.2014 11:52:48)

Re: ключове слово volatile

Ключове слово volatile вказує на те, що значення змінної може змінюватися асинхронно і ця змінна не підлягає "оптимізації", наприклад з підпрограми опрацьовувача апаратного переривання. Пробачте, що одразу не побачив що розділ - Java. В такому разі, значення змінної може постійно змінюватися "некерованим" кодом або з якихось винятків.

Re: ключове слово volatile

А приклад можна :-X . Теорію я розумію, але на практиці не все виходить...

4

Re: ключове слово volatile

http://javarevisited.blogspot.com/2011/ … orial.html

Re: ключове слово volatile

Знайшов такий приклад:

class ThreadClass extends Thread {
  private volatile int testValue;
  public ThreadClass(String str){
    super(str);
  }
  public void run() {
    for (int i = 0; i < 3; i++) {
      try {
        System.out.println(getName() + " : "+i);
        if (getName().equals("First")) {
          testValue = 1000;
        }
        if (getName().equals("Second")) {
          System.out.println( "Test Value : " + testValue);
        }        
        Thread.sleep(1000);
      } catch (InterruptedException exception) {
        exception.printStackTrace();
      }
    }
  }
}
public class VolatileClass {
  public static void main(String args[]) {
    new ThreadClass("First").start();
    new ThreadClass("Second").start();
  }
}

В мене виникло питання: чому з volatile і без volatile - виводить одне і те ж:

First : 0
Second : 0
Test Value : 0
First : 1
Second : 1
Test Value : 0
First : 2
Second : 2
Test Value : 0

6

Re: ключове слово volatile

Ключове слово voltile використовується щоб компілер точно нічого не наплутав, тобто 9 з 10 випадків все буде і так працювати, а от якщо забудеш поставити, то може працюватиме, а може і ні.

Re: ключове слово volatile

Тобто, якщо не поставлю то може вивести Test Value : 1000?

8 Востаннє редагувалося koala (07.06.2014 16:16:09)

Re: ключове слово volatile

volatile може яскраво спрацювати на такій конструкції:

static volatile int x;
...
Перший потік:
while(true)
{
  System.out.println('x='+x);
  if(x==10){System.out.println('10!');Thread.sleep(1000);}
  if(x==10){System.out.println('10 again!');}
}  
Thread.sleep(1000);
..
Другий потік:
while(true)
{
  x=1;
  sleep(100);
  x=10;
  sleep(100);
}

Syntax sugar за смаком.

Re: ключове слово volatile

Скажіть, будь ласка, x має бути оголошена в окремому класі і потоки мають бути породжені окремими класами?

10 Востаннє редагувалося koala (07.06.2014 16:43:38)

Re: ключове слово volatile

x має бути проголошена в зоні, де її бачать обидва потоки - наприклад, статичною в класі із цими потоками. І ніхто не заважає зробити один клас з 2 варіантами потоків, наприклад,
class ThreadClass extends Thread {
  private volatile int x;
  private int type;
  public void run() {
  if(type==0){перший потік}
  else {другий}
}

Re: ключове слово volatile

Не може зрозуміти суті констрекції if(run==0)... run це ж ім'я методу...

12

Re: ключове слово volatile

скоріше за все на місці run повинно бути x

13

Re: ключове слово volatile

Ні, вибачте. Виправив. Це змінна, яка встановлюється в конструкторі.