Как использовать ReadWriteLock?

Взгляд HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5\. Один из них должен быть верным:

  • Эти Version значение в том ключе должно быть 3.5.30729.01
  • Или эти SP, значение в том же ключе должно быть 1

В C# (взятый из первого комментария), Вы могли сделать что-то вдоль этих строк:

const string name = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5";
RegistryKey subKey = Registry.LocalMachine.OpenSubKey(name);
var version = subKey.GetValue("Version").ToString();
var servicePack = subKey.GetValue("SP").ToString();
5
задан KLE 29 October 2009 в 12:42
поделиться

4 ответа

Я предлагаю справиться с этим следующим образом:

  1. Сделайте вашу карту доступной в центральном месте (может быть синглтон Spring, статический ...).
  2. При запуске перезагрузки , пусть экземпляр как есть, работает в другом экземпляре карты.
  3. Когда эта новая карта заполнена, замените старую карту этой новой (это атомарная операция).

Пример кода:

    static volatile Map<U, V> map = ....;

    // **************************

    Map<U, V> tempMap = new ...;
    load(tempMap);
    map = tempMap;

Эффекты параллелизма :

  • volatile помогает с видимостью переменной для других потоков.
  • При перезагрузке карты все другие потоки видят старое значение без изменений, поэтому они не несут никаких штрафов.
  • Любой поток, который извлекает значение карта за мгновение до ее изменения будет работать со старыми значениями.
    • Он может запрашивать несколько доступов к одному и тому же экземпляру старой карты, что отлично подходит для согласованности данных (не загружая первое значение из старой карты, а другие - из более новой).
    • Он завершит обработку своего запроса с старая карта, но следующий запрос снова запросит карту и получит новые значения.
6
ответ дан 18 December 2019 в 13:16
поделиться

Если клиентские потоки не изменяют карту, т. Е. Содержимое карты зависит исключительно от источника, из которого она загружена, вы можете просто загрузить новую карту и заменить ссылку на карта, которую ваши клиентские потоки используют после загрузки новой карты.

В противном случае использование двойной памяти на короткое время не приводит к снижению производительности.

В случае, если карта использует слишком много памяти, чтобы иметь 2 из них , вы можете использовать ту же тактику для каждого объекта на карте; перебирать карту, создавать новый сопоставленный объект и заменять исходное сопоставление после загрузки объекта.

3
ответ дан 18 December 2019 в 13:16
поделиться

К сожалению, он не отображается возможно: С сайта TBB. .
Одно из предложений на форуме Intel заключалось в том, чтобы скомпилировать его вручную, если вам действительно нужна статическая связь: Из форума Intel .

contains (key) , клиент может получить null на map.get (key) - и вы почти наверняка завершите этот запрос исключением NullPointerException. Поэтому, если вы выполняете несколько операций чтения карты и вам нужно сделать некоторые предположения, подобные упомянутому ранее, проще всего сохранить локальную ссылку на карту (возможно, устаревшую).

Ключевое слово volatile здесь не обязательно . Он просто обеспечит использование новой карты другими потоками, как только вы измените ссылку ( map = newMap ). Без volatile последующее чтение ( local = map ) могло еще некоторое время возвращать старую ссылку (хотя мы говорим о менее чем наносекунде) - особенно в многоядерных системах, если я правильно помню. Меня бы это не волновало,

2
ответ дан 18 December 2019 в 13:16
поделиться

Мне очень нравится решение volatile Map от KLE, и я бы с ним согласился. Еще одна идея, которая может показаться интересной, - использовать эквивалент карты CopyOnWriteArrayList, в основном CopyOnWriteMap. Мы создали одну из них внутри компании, и это нетривиально, но вы можете найти COWMap в дикой природе:

http://old.nabble.com/CopyOnWriteMap-implementation-td13018855.html

2
ответ дан 18 December 2019 в 13:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: