2014-09-30 3 views
4

Ниже приведены два подхода, создающих экземпляр concurrentHashMap. Я понимаю, что подход 2 является потокобезопасным, но не подходит 1. Но я разговариваю с коллегой и с вами, поскольку оба создают экземпляр concurrentHashMap не должен приближаться к 1 также потокобезопасным тоже?Безопасность потоков с помощью карты и concurrentHashMap

Подход 1:

private static final Map<key, value> map = new ConcurrentHashMap<key, value>(); 

подход 2:

private static final ConcurrentHashMap<key, value> concurrentHashMap = new ConcurrentHashMap<key, value>(); 

Оценил любые разъяснения по этому вопросу.

+5

Это в основном та же разница, что и между словами «вот мой сын, Джон» и «вот мой ребенок, Джон». Как бы вы ни ссылались на Джона, я всегда Джон. Это базовый полиморфизм, и вы должны определенно понять это, прежде чем даже думать о многопоточности и безопасности потоков, что намного сложнее. –

+0

Вы также можете использовать 'Collections.synchronizedMap (map)'. – Hannes

ответ

6

В обоих случаях создается ConcurrentHashMap, поэтому безопасность потоков точно такая же.

ConcurrentHashMap реализует интерфейс Map, который вы вызываете в примере 1. Но это не влияет на базовый объект, который был создан.

2

Очевидно, что объект имеет одинаковый тип исполнения в обоих случаях.

Однако, если рассматривать как Map, то putIfAbsent и другие ConcurrentMap методы скрыты от клиентов. Отказавшись от них и вынуждая их использовать традиционные put и get, я обеспокоен тем, что ваш коллега высказывает свое мнение.

0

Следующее создает только указатель для объекта Map и присваивает ему значение null.

private static final Map<key, value> map; 

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

map = new ConcurrentHashMap<key, value>(); 

Так что не может быть никакой разницы между ними!

1

Оба решения являются потокобезопасными. Вы должны лучше познакомиться с java-интерфейсами :) Потому что оба являются ссылками на ту же реализацию карты. Первое решение скрывает этот факт через интерфейс, второй - нет. Первый подход - даже claner - его рекомендуется использовать интерфейс api вместо класса obj, когда дело доходит до коллекций. Это поможет применить изменения к вашему коду. Надеюсь, мое объяснение немного поможет.

Смежные вопросы