В Java, когда мы хотим убедиться, что компилятор не должен выполнять оптимизацию, сохраняя локальную копию переменной, мы делаем переменную изменчивой. Использование переменной как volatile гарантирует, что потоки не будут использовать локальную копию переменной, но они будут использовать переменную, поскольку она хранится в основной памяти. Но означает ли это, что изменчивая переменная является потокобезопасной? Также как он отличается в случае примитивного типа и в случае использования пользовательского объекта?Является ли volatile средним потокобезопасным?
ответ
volatile
означает, что значение всегда будет свежо; если другой поток помещает новый объект в переменную до вас, вы увидите этот объект.
Это не изменяет поведение значения; вы не можете магически сделать объект потокобезопасным.
В зависимости от того, что вы считаете "значение," ' volatile' даже не гарантирует свежесть для изменяемых классов. Если класс является неизменным и окончательным, то обозначение его ссылки 'volatile' * будет * сделать его потокобезопасным. – yshavit
@yshavit: если переменная 'final', то' volatile' не будет иметь никакого значения, AFAIK. – SLaks
В последнем классе я имел в виду, что класс помечен 'final' (не может быть расширен), а не то, что его ссылка отмечена' final'. Окончательный список полей
совсем нет, по сути, 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
летучих переменным обеспечивает visiblity и не является атомарным.
Летучий обычно наиболее подходит для «простого» состояния. Ex. логическую переменную-член, которая может быть установлена, чтобы сообщить об окончании рабочего потока.
Значение переменной volatile никогда не будет храниться на месте локально.
все считывает и записывает в основной памяти.
Летучий не обязательно означает запись в основную память. Это означает, что каждый поток будет читать самое последнее значение. Вы можете прочитать о связности кеша, чтобы увидеть, как это возможно. –
- 1. Является ли код потокобезопасным?
- 2. Является ли этот класс потокобезопасным?
- 3. Является ли libgcrypt потокобезопасным?
- 4. Является ли HashBiMap потокобезопасным?
- 5. Является ли ResteasyClient потокобезопасным?
- 6. Является ли EPiServer потокобезопасным?
- 7. Является ли это потокобезопасным?
- 8. Является ли JMapViewer потокобезопасным?
- 9. Является ли XMLInputFactory потокобезопасным?
- 10. Является ли фильтр потокобезопасным
- 11. Является ли JsonMessageConverter потокобезопасным?
- 12. Является ли PHP потокобезопасным?
- 13. Является ли NashornScriptEngine потокобезопасным?
- 14. Является ли HippoMocks потокобезопасным?
- 15. Является ли DWScript потокобезопасным?
- 16. Является ли ValueExpression потокобезопасным?
- 17. Является ли RequestContextHolder потокобезопасным?
- 18. Является ли NSIndexPath потокобезопасным?
- 19. Является ли PipelineModel потокобезопасным?
- 20. Является ли MapsInitializer.initialize() потокобезопасным?
- 21. Является ли NSPasteboard потокобезопасным?
- 22. Является ли createTempFile потокобезопасным?
- 23. Является ли HttpContext.Current.Cache потокобезопасным?
- 24. Является ли github3py потокобезопасным?
- 25. Является ли log4j потокобезопасным?
- 26. Является ли PrintWriter потокобезопасным?
- 27. Является ли BlobstoreService потокобезопасным?
- 28. Является ли OracleDataSource.getConnection потокобезопасным?
- 29. Является ли udev потокобезопасным?
- 30. Является ли C# + = потокобезопасным?
http://jeremymanson.blogspot.com/2008/11/what-volatile-means-in-java.html – SLaks