Вопрос относительно Java volatile ключевое слово для ссылочных типов - PullRequest
4 голосов
/ 04 июня 2011

Я понимаю, что ключевое слово volatile в Java может сделать операции чтения / записи ссылочных переменных и всех примитивов, кроме long и double, атомарными по своей природе.

Я также знаю составные операторы, такие как увеличение целого числа, var ++, не являются атомарными и не должны использоваться вместо синхронизированных операторов.

А как насчет этого класса?

public class Setter{

private int num = 0;

public int setNum(int numIn){
num = numIn;
return num;
}
}

Теперь скажем, что вы объявляете экземпляр Setter как volatile.

public class Main {
     private volatile Setter s;

public static void main(String[] args){
     s = new Setter();
     s.setNum(5);
}
}

Является ли вызов метода setNum атомарным?Безопасен ли этот оператор, если несколько потоков вызывают его одновременно, каждый с разными значениями?

Что может быть примером правильного использования энергозависимого класса и использования его в небезопасном составном операторе?

Ответы [ 3 ]

3 голосов
/ 04 июня 2011

Является ли вызов метода setNum атомарным?

Нет, это не так. Только чтение / запись в s будет изменчивым.

Это можно сравнить с разрешением List быть final. Этого недостаточно, чтобы сделать список неизменным, только саму ссылку на список.

1 голос
/ 04 июня 2011

Ссылка на объект и содержание этого объекта - разные вещи. В вашем случае ссылка (, которая является частью вашего основного класса ) к объекту равна volatile, что означает, что при чтении / записи ссылки volatile правила будут применяться. Вы можете свободно иметь другую ссылку на тот же объект, который не является изменчивым, и правила volatile не будут применяться к нему.

1 голос
/ 04 июня 2011

Нет, использование volatile относится только к ссылке s, а не к полям объекта, на который она ссылается.Вы не можете (безопасно) сделать так, чтобы несколько потоков вызывали s.setNum(n).

Тем не менее можно было бы создать поток, создающий новый объект Setter, сохранить в нем число, а затем изменить s наобратитесь к новому объекту вместо старого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...