powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Java [игнор отключен] [закрыт для гостей] / Подскажите на счет synchronized
25 сообщений из 25, страница 1 из 1
Подскажите на счет synchronized
    #39852111
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Подскажите, если в какой-то момент нужно иметь единоличный доступ одного потока к нескольким объектам, 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
Подскажите на счет synchronized
    #39852143
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Краткий ответ - да. Но тут есть очень много моментов к обсуждению, почему приведенный код адское ...но.

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

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

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

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

Совет - пересмотреть задачу - тоже хорош. Но когда человек эту задачу может себе поставить.
Если ему сказали "копай от забора и до вечера" - то тут вряд-ли что-то можно смотреть.
...
Рейтинг: 0 / 0
Подскажите на счет synchronized
    #39852263
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
Подскажите на счет synchronized
    #39852276
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
Подскажите на счет synchronized
    #39852302
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я могу свести твою задачу к работе с парой значений в качестве Value

Код: java
1.
2.
3.
4.
public class ShowClass {
    private static HashMap<Long, Pair<String,String>> hashMap = new HashMap<>();
    ....
}
...
Рейтинг: 0 / 0
Подскажите на счет synchronized
    #39852309
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Подскажите на счет synchronized
    #39852311
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя check просто будет проверять на левый и правый атрибут. Ферштейн?
...
Рейтинг: 0 / 0
Подскажите на счет synchronized
    #39852312
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonУ тебя check просто будет проверять на левый и правый атрибут. Ферштейн?
А обратно, по value (левый или правый) можно будет найти id? Раньше просто не юзал в такой комбинации
...
Рейтинг: 0 / 0
Подскажите на счет synchronized
    #39852320
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перед мапой обычно не ставят таких задач. Можно построить мапу наоборот. Где value - это ключ.
Но подумай хорошо. Тебе такое надо? Обычно поиск по неключевым атрибутам - это явно ошибочная
постановка.
...
Рейтинг: 0 / 0
Подскажите на счет synchronized
    #39852329
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так а ты имеешь контроль над этими мапами или они сторонние? Просто сложно представить бизнес юскейс - возможно лучше переписать логику верхнего уровня, чтобы допустим маршрутизировать на новую мапу и ничего не лочить, или смержить их, или как mayton сказал. Есть ли веротяность что значения нету ни в одной из мап? Как часто обновляются значения? А вы вообще уверенно что вам такой жесткий консистенси нужен?
...
Рейтинг: 0 / 0
Подскажите на счет synchronized
    #39852332
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там если eventual consistency то не надо елочки из synchronized делать. Вся структура - просто отбивает
короткие транзакции.
...
Рейтинг: 0 / 0
Подскажите на счет synchronized
    #39852364
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл никТак а ты имеешь контроль над этими мапами или они сторонние?
Да, контролировать могу.

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

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

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

То есть, если одни поток записал значение в мапу, пока этот элемент не будет обработан, добавлять новый с таким же ID нельзя (для случая validate()).
...
Рейтинг: 0 / 0
Подскажите на счет synchronized
    #39852370
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ip,
Над двумя мапами построй API.
Чтобы вставка метод был ТОЛЬКО ОДИН.
И т. д.
Так как межмаповые блоки это изврат.
Блок ставят на метод.
...
Рейтинг: 0 / 0
Подскажите на счет synchronized
    #39852371
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Подскажите на счет synchronized
    #39852375
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ipИ только иногда нужно блокировать сразу два списка, чтобы получить актуальные данные.в этом вся соль задачи а ты не развернул что такое актуальные и когда иногда)
...
Рейтинг: 0 / 0
Подскажите на счет synchronized
    #39852390
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharpqi_ipИ только иногда нужно блокировать сразу два списка, чтобы получить актуальные данные.в этом вся соль задачи а ты не развернул что такое актуальные и когда иногда)
Ну, при работе двух потоков, чтобы не было такого, что пока один читал значение из мапы, другой изменил/удалил эту запись. Один прочитал, обработал значение. Отпустил мапу. Второй подключился - удалил/изменил.
...
Рейтинг: 0 / 0
Подскажите на счет synchronized
    #39852393
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ipВ целом нет, поэтому тут отписался ))))...такая структура прописана, потому что нужна четкая очередность обработки данных. Чтобы в одну мапу не записались разные из нескольких потоков.

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

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

qi_ipпрочитал, обработал значение
Зачем держать мапу ПОСЛЕ ТОГО КАК ПРОЧИТАЛ?
...
Рейтинг: 0 / 0
Подскажите на счет synchronized
    #39852414
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ipОтпустил мапу. Второй подключился - удалил/изменил.мапа это таблица. Блок целиком таблицы это самое гадское от программиста 1С.
...
Рейтинг: 0 / 0
Подскажите на счет synchronized
    #39852421
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
25 сообщений из 25, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Подскажите на счет synchronized
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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