Использование Hashmap как потокобезопасного при параллельном выполнении теста - PullRequest
2 голосов
/ 13 марта 2020

У меня есть класс, используемый для генерации случайных значений и помещения этих случайных значений в хэш-карту. Но я настроил набор тестов, чтобы иметь возможность выполнять Paralley. Итак, я объявил constroctor как private, чтобы быть потокобезопасным в этом хэш-файле. Этот механизм прав? Если это неправильно, как я могу достичь этого?

public  class RandomData{
    private static Hashmap map = new Hashmap();

    private RandomData(){}

    public String getRandomVal(){

        /* generate random value and put the map, if this generated 
         value is not existing in the map, it will return or else 
         a new value is generated again and return. */
    }
}

Ответы [ 3 ]

2 голосов
/ 13 марта 2020

У вас есть один экземпляр HashMap, который используется всеми экземплярами RandomData. Если несколько потоков пытаются обновить его (вызывая getRandomVal) одновременно, вы можете получить неопределенное поведение, так как HashMap не является потокобезопасным. Вы можете решить эту проблему, используя поточно-ориентированную реализацию Map, например ConcurrentHashMap.

1 голос
/ 13 марта 2020

Нет, просто сделать конструктор частным, не сделает поток класса безопасным

 public static class RandomData {
        private static final ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();

        private RandomData() { }

        public String getRandomVal() {

        /* generate random value and put the map, if this generated
         value is not existing in the map, it will return or else
         a new value is generated again and return. */

        }


    }

Используйте ConcurrentHashMap и его методы:

посмотрите на:

ConcurrentHashMap::computeIfAbsent
ConcurrentHashMap::putIfAbsent

эти методы являются атомами c и гарантированно безопасны.

1 голос
/ 13 марта 2020

HashMaps не являются потокобезопасными. Создание переменной / метода не делает потокобезопасным. Вы должны использовать ConcurrentHashMaps or HashTable для обеспечения безопасности потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...