Тема: ключове слово volatile
Доброго дня! Наведіть, будь ласка, приклад використання ключового слова volatile. Дякую!
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Java → ключове слово volatile
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
Доброго дня! Наведіть, будь ласка, приклад використання ключового слова volatile. Дякую!
Ключове слово volatile вказує на те, що значення змінної може змінюватися асинхронно і ця змінна не підлягає "оптимізації", наприклад з підпрограми опрацьовувача апаратного переривання. Пробачте, що одразу не побачив що розділ - Java. В такому разі, значення змінної може постійно змінюватися "некерованим" кодом або з якихось винятків.
А приклад можна . Теорію я розумію, але на практиці не все виходить...
Знайшов такий приклад:
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
Ключове слово voltile використовується щоб компілер точно нічого не наплутав, тобто 9 з 10 випадків все буде і так працювати, а от якщо забудеш поставити, то може працюватиме, а може і ні.
Тобто, якщо не поставлю то може вивести Test Value : 1000?
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 за смаком.
Скажіть, будь ласка, x має бути оголошена в окремому класі і потоки мають бути породжені окремими класами?
x має бути проголошена в зоні, де її бачать обидва потоки - наприклад, статичною в класі із цими потоками. І ніхто не заважає зробити один клас з 2 варіантами потоків, наприклад,
class ThreadClass extends Thread {
private volatile int x;
private int type;
public void run() {
if(type==0){перший потік}
else {другий}
}
Не може зрозуміти суті констрекції if(run==0)... run це ж ім'я методу...
скоріше за все на місці run повинно бути x
Ні, вибачте. Виправив. Це змінна, яка встановлюється в конструкторі.
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися