2012-01-30 2 views
1

В Java, когда мы хотим убедиться, что компилятор не должен выполнять оптимизацию, сохраняя локальную копию переменной, мы делаем переменную изменчивой. Использование переменной как volatile гарантирует, что потоки не будут использовать локальную копию переменной, но они будут использовать переменную, поскольку она хранится в основной памяти. Но означает ли это, что изменчивая переменная является потокобезопасной? Также как он отличается в случае примитивного типа и в случае использования пользовательского объекта?Является ли volatile средним потокобезопасным?

+0

http://jeremymanson.blogspot.com/2008/11/what-volatile-means-in-java.html – SLaks

ответ

9

volatile означает, что значение всегда будет свежо; если другой поток помещает новый объект в переменную до вас, вы увидите этот объект.

Это не изменяет поведение значения; вы не можете магически сделать объект потокобезопасным.

+0

В зависимости от того, что вы считаете "значение," ' volatile' даже не гарантирует свежесть для изменяемых классов. Если класс является неизменным и окончательным, то обозначение его ссылки 'volatile' * будет * сделать его потокобезопасным. – yshavit

+0

@yshavit: если переменная 'final', то' volatile' не будет иметь никакого значения, AFAIK. – SLaks

+0

В последнем классе я имел в виду, что класс помечен 'final' (не может быть расширен), а не то, что его ссылка отмечена' final'. Окончательный список полей list = ArrayList 'не является потоковым, потому что' ArrayList' не является неизменным. Но я имел в виду тот факт, что 'volatile String' является потокобезопасным (не считая атомарности с другими полями), потому что' String' является неизменным. – yshavit

3

совсем нет, по сути, volatile означает, что это значение видно другому потоку сразу, но don't означает, что он потокобезопасен, он не является потокобезопасным.

вы можете увидеть это: http://java.sun.com/docs/books/jls/third_edition/html/classes.html и найти keyworkd volatile Fields

других смотрите здесь: http://www.ibm.com/developerworks/java/library/j-jtp06197/index.html

0

летучих переменным обеспечивает visiblity и не является атомарным.

0

Летучий обычно наиболее подходит для «простого» состояния. Ex. логическую переменную-член, которая может быть установлена, чтобы сообщить об окончании рабочего потока.

0

Значение переменной volatile никогда не будет храниться на месте локально.

все считывает и записывает в основной памяти.

meaning of volatile is different depending on the version of Java (i.e till Java 1.4 and after Java5.0).

one more link about volatile

+0

Летучий не обязательно означает запись в основную память. Это означает, что каждый поток будет читать самое последнее значение. Вы можете прочитать о связности кеша, чтобы увидеть, как это возможно. –

Смежные вопросы