Почему ConcurrentHashMap предотвращает пустые ключи и значения?

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

// Add custom order meta data with temporary data from WC_Session
add_action( 'woocommerce_checkout_create_order', 'add_session_data_as_custom_order_meta_data', 10, 2 );
function add_session_data_as_custom_order_meta_data( $order, $data ) {
    if ( $session_data = WC()->session->get('my_key') ) {
         $order->update_meta_data( '_session_data', $session_data );
    }
}

Код добавляется в файл function.php вашей активной дочерней темы (или темы). Проверено и работает.


Затем для доступа к данным вы будете использовать метод WC_Data get_meta() объекта WC_Order:

$session_data = $order->get_meta('_session_data');

Или также использовать функцию get_post_meta() из определенной ] Id заказа :

$session_data = get_post_meta( $order_id, '_session_data', true );
136
задан Marcel 30 March 2009 в 19:40
поделиться

4 ответа

Josh Bloch разработан HashMap; Doug Lea разработан ConcurrentHashMap. Я надеюсь, что это не является клеветническим. На самом деле я думаю, что проблема состоит в том, который аннулирует, часто требуют обертывания так, чтобы реальный пустой указатель мог обозначать неинициализированный. Если клиентский код требует, аннулирует затем, он может заплатить, (по общему признанию маленькая) стоимость обертывания аннулирует себя.

4
ответ дан 23 November 2019 в 23:39
поделиться

ConcurrentHashMap ориентирован на многопотоковое исполнение. Я полагаю, что не разрешение пустых ключей и значений было частью проверки, что это ориентировано на многопотоковое исполнение.

0
ответ дан 23 November 2019 в 23:39
поделиться

Вы не можете синхронизироваться на пустом указателе.

Править: Это не точно почему в этом случае. Я первоначально думал, что было что-то, представляют себе продолжать блокировку вещей против параллельных обновлений или иначе использования Объектного монитора, чтобы обнаружить, если что-то было изменено, но после исследования исходного кода кажется, что я был неправ - они блокируют использование "сегмента" на основе битовой маски хеша.

В этом случае я подозреваю, что они сделали это для копирования Хеш-таблицы, и я подозреваю, что Хеш-таблица сделала это потому что в мире реляционной базы данных, пустом указателе! = пустой указатель, таким образом с помощью пустого указателя в качестве ключа не имеет никакого значения.

1
ответ дан 23 November 2019 в 23:39
поделиться

Я предполагаю, что следующий отрывок документации API дает хорошую подсказку: "Этот класс полностью совместим с Хеш-таблицей в программах, которые полагаются на его потокобезопасность, но не в его деталях синхронизации".

Они, вероятно, просто хотели сделать ConcurrentHashMap полностью совместимый/взаимозаменяемый с Hashtable. И как Hashtable не позволяет пустые ключи и значения..

0
ответ дан 23 November 2019 в 23:39
поделиться
Другие вопросы по тегам:

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