ConcurrentHashMap в Codename One - PullRequest
1 голос
/ 29 мая 2020

Мне нужно использовать один и тот же HashMap из разных потоков (EDT, таймер и, возможно, сетевой поток) . Поскольку Codename One не имеет реализации ConcurrentHashMap в своем API, я попытался обойти эту проблему, поэтому:

/**
 * ConcurrentHashMap emulation for Codename One.
 */
public class ConcurrentHashMap<K, V> {

    private static final EasyThread thread = EasyThread.start("concurrentHashMap_Thread");
    private final Map<K, V> map = new HashMap<>();

    public V put(K key, V value) {
        return thread.run(() -> map.put(key, value));
    }

    public V get(K key) {
        return thread.run(() -> map.get(key));
    }

    public V remove(K key) {
        return thread.run(() -> map.remove(key));
    }

}

У меня два вопроса:

  1. Действительно ли необходим код, подобный приведенному выше, в Codename One при доступе к Map из двух или более потоков? Лучше ли использовать HashMap напрямую?

  2. Что вы думаете об этом коде? Я постарался сделать его максимально простым, но не уверен в его правильности.

1 Ответ

1 голос
/ 30 мая 2020

Этот код очень правильный. Это также очень неэффективно, поскольку вы создаете несколько блокировок для добавления нового объекта в другой поток. Таким образом, вы эффективно подводите танк к проблеме, которая намного проще.

TL; DR таков:

map = Collections.synchronizedMap(map);

Ваш код можно было бы написать так, и он был бы больше эффективный:

public class ConcurrentHashMap<K, V> {
    private static final EasyThread thread = EasyThread.start("concurrentHashMap_Thread");
    private final Map<K, V> map = new HashMap<>();

    public synchronized V put(K key, V value) {
        return map.put(key, value);
    }

    public synchronized V get(K key) {
        return map.get(key);
    }

    public synchronized V remove(K key) {
        return map.remove(key);
    }
}

Но вам, очевидно, это не нужно, поскольку у нас есть метод synchronizedMap ...

Так почему бы нам не ConcurrentHashMap?

Потому что мы не работаем на огромных серверах. См. Эту статью: https://crunchify.com/hashmap-vs-concurrenthashmap-vs-synchronizedmap-how-a-hashmap-can-be-synchronized-in-java/

TL; DR этой статьи состоит в том, что ConcurrentHashMap имеет смысл, когда у вас много потоков и много ядер сервера. Он пытается go лишнюю милю при ограничении синхронизации для максимального масштаба. Для мобильных устройств это большой перебор.

...