среда, 11 ноября 2009 г.

Lecture: Safe Publication

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

5 комментариев:

  1. А в Java есть какие-то паттерны для приватизации? Кроме как пропустить объект через GC естественно.

    ОтветитьУдалить
  2. А наоборот, выводим объект из общего пользования в личное.

    ОтветитьУдалить
  3. Допустим есть разделяемый хэш мап, с которым работает несколько потоков. Когда поток добавляет новый объект в хэш мап, он делает *публикацию*, т.е. делает объект доступным для других потоков.
    Теперь допустим, что объекты у нас большие и/или дорогие в создании и потоку надо извлечь объект из хэш мапа, что бы другие потоки больше не обращались к этому объекту, что бы, допустим, изменить объект и вставить его опять в хэш мап или что бы передать другому потоку для какой-то обработки. Этот процесс обратный публикации, и называется *приватизацией*, т.е. переводим объект из общего пользования в личное распоряжение.
    Приватизация тривиально реализуется при использовании coarse-grained locking, а вот при использовании более "продвинутых" техник становится достаточно проблематичной. Вообще говоря, Java имеет встроенную поддержку приватизации, но только для одного частного случая - разрушение объекта, т.е. после "пропускания объекта через GC", он безопасен для приватизации. Однако неприятный побочный эффект такой приватизации - это разрушение всех данных, ну и плюс к тому непонятно, когда именно объект "пройдёт через GC".
    Для STM это проблема активно обсуждается и ищутся решения, раньше STM не поддерживали приватизацию, потом она давалась очень дорогой ценой, сейчас для неё нашли более-менее недорогие решения. Если интересно, то можно погуглить по "stm privatization safety", так можно найти не только алгоритмы STM, но и просто материал о проблеме в целом.

    ОтветитьУдалить
  4. Мое представление о процессе "смерти" в яве:
    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()).
    С конкретными паттернами я не сталкивался, наиболее близко подходит - слабые ссылки, я по ним уже сделал пост, там весьма емкая статья.

    ОтветитьУдалить