About "Safe Publication" it be the best way to read in "Java Concurrency in Practice":
3.5. Safe Publication
3.5.1. Improper Publication: When Good Objects Go Bad
3.5.2. Immutable Objects and Initialization Safety
3.5.3. Safe Publication Idioms
3.5.4. Effectively Immutable Objects
3.5.5. Mutable Objects
3.5.6. Sharing Objects Safely
среда, 11 ноября 2009 г.
Подписаться на:
Комментарии к сообщению (Atom)
А в Java есть какие-то паттерны для приватизации? Кроме как пропустить объект через GC естественно.
ОтветитьУдалитьА что значит "приватизация"?
ОтветитьУдалитьА наоборот, выводим объект из общего пользования в личное.
ОтветитьУдалитьДопустим есть разделяемый хэш мап, с которым работает несколько потоков. Когда поток добавляет новый объект в хэш мап, он делает *публикацию*, т.е. делает объект доступным для других потоков.
ОтветитьУдалитьТеперь допустим, что объекты у нас большие и/или дорогие в создании и потоку надо извлечь объект из хэш мапа, что бы другие потоки больше не обращались к этому объекту, что бы, допустим, изменить объект и вставить его опять в хэш мап или что бы передать другому потоку для какой-то обработки. Этот процесс обратный публикации, и называется *приватизацией*, т.е. переводим объект из общего пользования в личное распоряжение.
Приватизация тривиально реализуется при использовании coarse-grained locking, а вот при использовании более "продвинутых" техник становится достаточно проблематичной. Вообще говоря, Java имеет встроенную поддержку приватизации, но только для одного частного случая - разрушение объекта, т.е. после "пропускания объекта через GC", он безопасен для приватизации. Однако неприятный побочный эффект такой приватизации - это разрушение всех данных, ну и плюс к тому непонятно, когда именно объект "пройдёт через GC".
Для STM это проблема активно обсуждается и ищутся решения, раньше STM не поддерживали приватизацию, потом она давалась очень дорогой ценой, сейчас для неё нашли более-менее недорогие решения. Если интересно, то можно погуглить по "stm privatization safety", так можно найти не только алгоритмы STM, но и просто материал о проблеме в целом.
Мое представление о процессе "смерти" в яве:
ОтветитьУдалить1) java.lang.Object.finalize()
2) java.lang.ref.*
3) java.lang.Runtime.addShutdownHook(Thread hook)
4) java.lang.Thread.setUncaughtExceptionHandler()/setDefaultUncaughtExceptionHandler()
5) GC
6) class unloading
собственно по всем темам я опубликую наиболее содержательные наборы ссылок (там все не так просто даже с finalize()).
С конкретными паттернами я не сталкивался, наиболее близко подходит - слабые ссылки, я по ним уже сделал пост, там весьма емкая статья.