Гость
Форумы / Java [игнор отключен] [закрыт для гостей] / Подскажите на счет synchronized / 25 сообщений из 25, страница 1 из 1
21.08.2019, 13:57
    #39852111
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите на счет synchronized
Здравствуйте!

Подскажите, если в какой-то момент нужно иметь единоличный доступ одного потока к нескольким объектам, synchronized нужно использовать для каждого объекта?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
private HashMap<Long, String> map_one = new HashMap();
private HashMap<Long, String> map_two = new HashMap();

public void SynchMethod {
      ....тут какой-то код 
            synchronized (map_one) {
                synchronized (map_two) {
                    try {
                        map_one.put(1L, "some text");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
    }



И для кадждого следующиего объекта надо будет просто добавить synchronized (object)?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
synchronized (object1) {
   synchronized (object2)  {
      synchronized (object3)  {
         synchronized (object4)  {
         }
      }
   }
}



Спасибо
...
Рейтинг: 0 / 0
21.08.2019, 14:43
    #39852143
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите на счет synchronized
Краткий ответ - да. Но тут есть очень много моментов к обсуждению, почему приведенный код адское ...но.

Совет 1 - прочитайте несоклько раз Java Concurrency in practice прежде чем писать ЧТО_ЛИБО связанное с многопоточностью, прочитать лучше несколько раз.
Совет 2 - естсественно на 1) нужно время а задачи как-то нужно решать. В этом случае вместо приведенного решения, лучше приведите задачу, и знающие люди подскажут вам направление куда двигаться, потом уже можете выложить дизайн и его будут точечно подправлять.

Теперь о том почему ваш код плох.

1) С высокой вероятностью он приведет к дедлоку, так как никто не гарантирует что локи будут вызываться в одном и том же порядке. Если их будут брать в обратном - то программе капец.
2) Ручное управление локами в принципе подвержено ошибкам, а множественные synchronize сильно бьют по перфомансу программы
3) Есть множество других решений\моделей без synchronize - начиная от Atomic\очередей\экзекьюторов до модели акторов, STM и map-reduce
4) Самый правильный совет в многопоточке - не шарить данные вообще, возможно вам просто надо пересмотреть задачу.

Ну и это не говоря о таких тонких вещах как JMM, happens-before и вся остальная чертовщина
...
Рейтинг: 0 / 0
21.08.2019, 16:17
    #39852211
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите на счет synchronized
qi_ip, попробуй заменить одну мапу на https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html
может взлетит.
...
Рейтинг: 0 / 0
21.08.2019, 16:23
    #39852217
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите на счет synchronized
maytonqi_ip, попробуй заменить одну мапу на https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html
может взлетит.
очень вредный совет, без знания нутра - тыкаться в многопоточке очень опасно, и хорошо если это flowershop а не боинг
...
Рейтинг: 0 / 0
21.08.2019, 17:00
    #39852256
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите на счет synchronized
забыл никmaytonqi_ip, попробуй заменить одну мапу на https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html
может взлетит.
очень вредный совет, без знания нутра - тыкаться в многопоточке очень опасно, и хорошо если это flowershop а не боинг
Пусть пробует.

Совет - пересмотреть задачу - тоже хорош. Но когда человек эту задачу может себе поставить.
Если ему сказали "копай от забора и до вечера" - то тут вряд-ли что-то можно смотреть.
...
Рейтинг: 0 / 0
21.08.2019, 17:07
    #39852263
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите на счет synchronized
забыл никлучше приведите задачу, и знающие люди подскажут вам направление куда двигаться, потом уже можете выложить дизайн и его будут точечно подправлять.

По задаче: есть этих два мэпа (HashMapOne и HashMapTwo). Есть два (или несколько) потоков, которые периодически обращаются к ним: получить данные по определенному элементу, добавить элемент в мэпу, удалить элемент в мэпу.

То есть, есть методы: get(), add(), remove(), validate(), check() которые должны иметь актуальные данные.
В основном всегда идет работа или c HashMapOne, или с HashMapTwo. И только иногда нужно блокировать сразу два списка, чтобы получить актуальные данные.

Код: java
1.
2.
3.
4.
5.
get() -> read HashMapOne
add() -> add to HashMapOne
remove() -> remove from HashMapOne
validate() -> read HashMapOne AND add to HashMapTwo
check() -> remove from HashMapTwo
...
Рейтинг: 0 / 0
21.08.2019, 17:19
    #39852276
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите на счет synchronized
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
public class ShowClass {
    private static HashMap<Long, String> hashMapOne = new HashMap<>();
    private static HashMap<Long, String> hashMapTwo = new HashMap<>();
    
    public static void get(Long id) {
        synchronized(hashMapOne){
            if(hashMapOne.containsKey(id)){
                System.out.println("Exist");
            }
        }
    }
    
    public static void add(Long cid) {
        synchronized(hashMapOne){
            hashMapOne.put(1L, "Some text");
        }
    }
    
    
    public static void validate(Long id) {
        synchronized(hashMapOne){
            synchronized(hashMapTwo){
                if(hashMapOne.containsKey(id) && !hashMapTwo.containsKey(id)){
                    hashMapTwo.put(id, "Some text");
                }
            }
        }
    }
    
    public static void remove(Long cid) {
        synchronized(hashMapOne){
            hashMapOne.remove(cid);
        }
    }
    
    public static void check(Long id) {
        synchronized(hashMapTwo){
            if(hashMapTwo.containsKey(id)){
                hashMapTwo.remove(id);
            }
        }
    }
}
...
Рейтинг: 0 / 0
21.08.2019, 17:46
    #39852302
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите на счет synchronized
Я могу свести твою задачу к работе с парой значений в качестве Value

Код: java
1.
2.
3.
4.
public class ShowClass {
    private static HashMap<Long, Pair<String,String>> hashMap = new HashMap<>();
    ....
}
...
Рейтинг: 0 / 0
21.08.2019, 17:57
    #39852309
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите на счет synchronized
maytonЯ могу свести твою задачу к работе с парой значений в качестве Value

Код: java
1.
2.
3.
4.
public class ShowClass {
    private static HashMap<Long, Pair<String,String>> hashMap = new HashMap<>();
    ....
}



В моем случае, не совсем подходит, так как могжет быть так, что данные есть в map_two, но нет в map_one
...
Рейтинг: 0 / 0
21.08.2019, 17:58
    #39852311
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите на счет synchronized
У тебя check просто будет проверять на левый и правый атрибут. Ферштейн?
...
Рейтинг: 0 / 0
21.08.2019, 18:04
    #39852312
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите на счет synchronized
maytonУ тебя check просто будет проверять на левый и правый атрибут. Ферштейн?
А обратно, по value (левый или правый) можно будет найти id? Раньше просто не юзал в такой комбинации
...
Рейтинг: 0 / 0
21.08.2019, 18:19
    #39852320
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите на счет synchronized
Перед мапой обычно не ставят таких задач. Можно построить мапу наоборот. Где value - это ключ.
Но подумай хорошо. Тебе такое надо? Обычно поиск по неключевым атрибутам - это явно ошибочная
постановка.
...
Рейтинг: 0 / 0
21.08.2019, 18:27
    #39852329
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите на счет synchronized
Так а ты имеешь контроль над этими мапами или они сторонние? Просто сложно представить бизнес юскейс - возможно лучше переписать логику верхнего уровня, чтобы допустим маршрутизировать на новую мапу и ничего не лочить, или смержить их, или как mayton сказал. Есть ли веротяность что значения нету ни в одной из мап? Как часто обновляются значения? А вы вообще уверенно что вам такой жесткий консистенси нужен?
...
Рейтинг: 0 / 0
21.08.2019, 18:36
    #39852332
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите на счет synchronized
Там если eventual consistency то не надо елочки из synchronized делать. Вся структура - просто отбивает
короткие транзакции.
...
Рейтинг: 0 / 0
21.08.2019, 20:24
    #39852364
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите на счет synchronized
забыл никТак а ты имеешь контроль над этими мапами или они сторонние?
Да, контролировать могу.

забыл никПросто сложно представить бизнес юскейс - возможно лучше переписать логику верхнего уровня, чтобы допустим маршрутизировать на новую мапу и ничего не лочить, или смержить их, или как mayton сказал
Попробую пересмотреть, но пока такая логика поставлена (((

забыл никЕсть ли веротяность что значения нету ни в одной из мап? Как часто обновляются значения?
Да, такая вероятность есть, могут быть пустыми обе мапы или одна из двух.

забыл никА вы вообще уверенно что вам такой жесткий консистенси нужен?
В целом нет, поэтому тут отписался ))))...такая структура прописана, потому что нужна четкая очередность обработки данных. Чтобы в одну мапу не записались разные из нескольких потоков.

То есть, если одни поток записал значение в мапу, пока этот элемент не будет обработан, добавлять новый с таким же ID нельзя (для случая validate()).
...
Рейтинг: 0 / 0
21.08.2019, 20:39
    #39852370
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите на счет synchronized
qi_ip,
Над двумя мапами построй API.
Чтобы вставка метод был ТОЛЬКО ОДИН.
И т. д.
Так как межмаповые блоки это изврат.
Блок ставят на метод.
...
Рейтинг: 0 / 0
21.08.2019, 20:47
    #39852371
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите на счет synchronized
qi_ip
Код: java
1.
2.
3.
4.
5.
get() -> read HashMapOne
add() -> add to HashMapOne
remove() -> remove from HashMapOne
validate() -> read HashMapOne AND add to HashMapTwo
check() -> remove from HashMapTwo


Вот ты сам описал API.
Делешь пакет с приватными двумя списками. Внешний фасад это публичный класс.
У него 5 методов выше с блоками на поток.
Чтобы 2 потока не зашли одновременно в метод check()
...
Рейтинг: 0 / 0
21.08.2019, 20:54
    #39852375
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите на счет synchronized
qi_ipИ только иногда нужно блокировать сразу два списка, чтобы получить актуальные данные.в этом вся соль задачи а ты не развернул что такое актуальные и когда иногда)
...
Рейтинг: 0 / 0
21.08.2019, 21:47
    #39852390
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите на счет synchronized
PetroNotC Sharpqi_ipИ только иногда нужно блокировать сразу два списка, чтобы получить актуальные данные.в этом вся соль задачи а ты не развернул что такое актуальные и когда иногда)
Ну, при работе двух потоков, чтобы не было такого, что пока один читал значение из мапы, другой изменил/удалил эту запись. Один прочитал, обработал значение. Отпустил мапу. Второй подключился - удалил/изменил.
...
Рейтинг: 0 / 0
21.08.2019, 21:56
    #39852393
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите на счет synchronized
qi_ipВ целом нет, поэтому тут отписался ))))...такая структура прописана, потому что нужна четкая очередность обработки данных. Чтобы в одну мапу не записались разные из нескольких потоков.

То есть, если одни поток записал значение в мапу, пока этот элемент не будет обработан, добавлять новый с таким же ID нельзя (для случая validate()).

Ну вот мы и дошли до сути задачи) По факту обычный балансировщик нагрузки. Я бы просто делал хэш от ключа - и если он четный - то кладем в первую мапу, если нечетный - во вторую. и ВСЕ. Никакой синхронизации, никаких локов, никаких лишних проверок
...
Рейтинг: 0 / 0
21.08.2019, 21:57
    #39852394
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите на счет synchronized
ну соотвественно и при проверке читаем из мапы по ключу(чет\нечет)
...
Рейтинг: 0 / 0
21.08.2019, 22:01
    #39852395
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите на счет synchronized
а единичную мапу сделать ConcurrentHashMap по совету mayton
...
Рейтинг: 0 / 0
21.08.2019, 22:50
    #39852413
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите на счет synchronized
qi_ipPetroNotC Sharpпропущено...
в этом вся соль задачи а ты не развернул что такое актуальные и когда иногда)
Ну, при работе двух потоков, чтобы не было такого, что пока один читал значение из мапы, другой изменил/удалил эту запись. Один прочитал, обработал значение. Отпустил мапу. Второй подключился - удалил/изменил.так. Ну а где тут вторая мапа? Нафиг она в задаче?

qi_ipпрочитал, обработал значение
Зачем держать мапу ПОСЛЕ ТОГО КАК ПРОЧИТАЛ?
...
Рейтинг: 0 / 0
21.08.2019, 22:54
    #39852414
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите на счет synchronized
qi_ipОтпустил мапу. Второй подключился - удалил/изменил.мапа это таблица. Блок целиком таблицы это самое гадское от программиста 1С.
...
Рейтинг: 0 / 0
21.08.2019, 23:27
    #39852421
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите на счет synchronized
qi_ipзабыл никлучше приведите задачу, и знающие люди подскажут вам направление куда двигаться, потом уже можете выложить дизайн и его будут точечно подправлять.

По задаче: есть этих два мэпа (HashMapOne и HashMapTwo). Есть два (или несколько) потоков, которые периодически обращаются к ним: получить данные по определенному элементу, добавить элемент в мэпу, удалить элемент в мэпу.

То есть, есть методы: get(), add(), remove(), validate(), check() которые должны иметь актуальные данные.
В основном всегда идет работа или c HashMapOne, или с HashMapTwo. И только иногда нужно блокировать сразу два списка, чтобы получить актуальные данные.

Код: java
1.
2.
3.
4.
5.
get() -> read HashMapOne
add() -> add to HashMapOne
remove() -> remove from HashMapOne
validate() -> read HashMapOne AND add to HashMapTwo
check() -> remove from HashMapTwo


Ты дал не настоящую постановку задачи. В настоящей постановке вообще нет никаких мапов.
Есть балансы. Проводки. Платежи. Остатки. Вот если бы ты не фантазировал или если-бы не фантазировал
твой тех-лид который придумывает брейнфаки - то мы-бы тебе вмиг сообразили красивую структуру
данных.

Ну не звучит... не звучит никогда от бизнеса такая задача как блокировать или не блокировать два списка.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Подскажите на счет synchronized / 25 сообщений из 25, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]