Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 14.06.2018
Сообщений: 16

Обеспечение потокобезопасности

15.09.2018, 03:53. Показов 924. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые коллеги, начал изучать Java несколько месяцев назад, прошу советов.
Написал чат, хочу обеспечить его потокобезопасность, так как , например, сервер на каждого подключившегося пользователя создает новый поток, который использует общие переменные: добавляет в них объекты, удаляет, считывает.

Java
1
2
protected static final LinkedList<Room> rooms = new LinkedList();
protected static final LinkedList<User> users = new LinkedList();
Например:

Java
1
2
3
4
5
6
7
8
9
10
public static boolean registerNewUser(User user){
        
        if(Server.users.contains(user)){ 
            return false;
        }
        else{  
            Server.users.add(user);
            return true;
        }
    }
Прошу подсказать, верно ли я рассуждаю:

Если просто добавить в сигнатуру метода syncronized, тогда получится синхронизация по объекту класса, в котором находятся методы, работающие с переменными, а значит, что в момент времени заблокируются все методы, подписанные syncronized,
что cильно снизит эффект многопоточности.
Тогда нужно синхронизировать по какому-нибудь объекту.
Как здесь правильнее поступить - использовать монитор какого-либо любого существующего объекта, или создать специальный новый объект для этой цели?
Как я понимаю, на каждый метод, используюший одну и ту же переменную нужен один общий объект, чтобы максимально дифференциировать доступ к разным переменным в один момент времени.

Например я создаю:

Java
1
2
3
 Object objectForRooms = new Object();
 
 Object objectForUsers = new Object();
И тогда внутри каждого метода, использующего переменную rooms, обращение к этой переменной мне нужно будет заключать в блок syncronized(objectForRooms), а для users - в блок syncronized(objectForUsers)?

Например так:
public static boolean registerNewUser(User user){

Java
1
2
3
4
5
6
7
8
9
10
11
12
syncronized(objectForUsers){
 
        
        if(Server.users.contains(user)){ 
            return false;
        }
        else{  
            Server.users.add(user);
            return true;
        }
    }
 }
А если, например, у меня метод будет использовать сразу обе переменные, то тогда как?

Заранее благодарю за конструктивную критику и сове
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.09.2018, 03:53
Ответы с готовыми решениями:

Обеспечение раздельного синхронизированного доступа к ресурсам
public class ThreadCar extends Thread { public void run() { new InsertTable().setVisible(true); } } - Вот...

Программное обеспечение для проведения оценки риска информационной безопасности
Привет, нужно написать программку по такой вот теме &quot;Программное обеспечение для проведения оценки риска информационной безопасности&quot; ...

Обеспечение безопасности приложения - Acegi Security
Я реализовывал перенос настроек на уровень базы данных. К сожалению API несколько неудачно, нет возможности упростить выборку,...

14
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,693
Записей в блоге: 29
15.09.2018, 07:48
мог что-то упустить, но зачем статик коллекции? сервер же один? и сними работать должен только он
почему не заюзать потокобезопасные коллекции?
а если уж и блокировать то не метод а саму коллекцию, залочил, проверил есть ли там юзер и если нет то добавил, снял лок.
0
0 / 0 / 0
Регистрация: 14.06.2018
Сообщений: 16
15.09.2018, 12:53  [ТС]
Сервер один, в нем есть внутренний класс
Java
1
private static class ServerHandler extends Thread
в этом классе в методе run() идет обращение к методам внешнего класса Server, а эти методы, в свою очередь обращаются к вспомогательным методам третьего класса Utils, которые работают с этими коллекциями.

"а если уж и блокировать то не метод а саму коллекцию"
имеете в виду вот так?

Java
1
2
3
4
5
6
7
8
    static Object objectForRooms = new Object();
 
    public static LinkedList<Room> getRooms() {
        
        synchronized (objectForRooms) {
            return rooms;
        }
    }
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
15.09.2018, 12:55
Rodriguez1, https://docs.oracle.com/javase... mmary.html
0
0 / 0 / 0
Регистрация: 14.06.2018
Сообщений: 16
16.09.2018, 20:56  [ТС]
Цитата Сообщение от xoraxax Посмотреть сообщение
https://docs.oracle.com/javase/8/doc...e-summary.html
Заменил
Java
1
2
   protected static final LinkedList<Room> rooms = new LinkedList();
    protected static final LinkedList<User> users = new LinkedList();
на
Java
1
2
    protected static final CopyOnWriteArrayList <Room> rooms = new CopyOnWriteArrayList<>();
    protected static final CopyOnWriteArrayList <User> users = new CopyOnWriteArrayList<>();
То есть этого должно быть достаточно?

Два вопроса:
1) А если все-таки принципиально использовать LinkedList, а не ArrayList?
2) А если бы общим ресурсом был не список, а , к примеру, String? Тогда правильным был бы вот такой подход?

Java
1
2
3
4
5
6
7
8
    static Object objectForRooms = new Object();
 
    public static String getRooms() {
        
        synchronized (objectForRooms) {
            return rooms;
        }
    }
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
16.09.2018, 23:37
Цитата Сообщение от Rodriguez1 Посмотреть сообщение
А если все-таки принципиально использовать LinkedList, а не ArrayList?
Зачем?

Цитата Сообщение от Rodriguez1 Посмотреть сообщение
А если бы общим ресурсом был не список, а , к примеру, String?
AtomicReference<String>?

Цитата Сообщение от Rodriguez1 Посмотреть сообщение
То есть этого должно быть достаточно?
Достаточно для чего?
0
0 / 0 / 0
Регистрация: 14.06.2018
Сообщений: 16
17.09.2018, 00:21  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
Достаточно для чего?
Для обеспечения безопасности работы с общим списком.

Цитата Сообщение от korvin_ Посмотреть сообщение
Зачем?
Ну если часто будут использоваться операции вставки-удаления, и редко - операция чтения, тогда ведь оптимальнее использовать LinkedList.
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
17.09.2018, 09:07
Цитата Сообщение от Rodriguez1 Посмотреть сообщение
тогда ведь оптимальнее использовать LinkedList.
нет
0
0 / 0 / 0
Регистрация: 14.06.2018
Сообщений: 16
17.09.2018, 15:17  [ТС]
Цитата Сообщение от xoraxax Посмотреть сообщение
нет
LinkedList удобен когда важнее быстродействие операций вставки/удаления, которые в LinkedList выполняются за константное время. Операции доступа по индексу производятся перебором с начала или конца (смотря что ближе) до нужного элемента. Дополнительные затраты на хранение связки между элементами.
Одним словом - если часто вставляете/удаляете - выбирайте в пользу LinkedList, в противном случае ArrayList


А поподробнее можно про "нет"?
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
17.09.2018, 15:32
заводить для каждого пользователя чата отдельный Thread мне кажется странной идеей
зачем??? каждый поток жрет память, ресурсы, каждый раз в процессор загружается другой контекст(?) что само по себе не "быстро"

поправьте если не прав
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
17.09.2018, 15:32
Цитата Сообщение от Rodriguez1 Посмотреть сообщение
Для обеспечения безопасности работы с общим списком.
А что насчёт
Цитата Сообщение от Rodriguez1 Посмотреть сообщение
А если, например, у меня метод будет использовать сразу обе переменные, то тогда как?
0
17.09.2018, 16:18

Не по теме:

Цитата Сообщение от Rodriguez1 Посмотреть сообщение
А поподробнее можно про "нет"?
загугли что-нибудь типа why you should never use linkedlist

0
0 / 0 / 0
Регистрация: 14.06.2018
Сообщений: 16
17.09.2018, 18:50  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
А что насчёт
А что в этом случае необходимо сделать? Залочить тело метода на два объекта этих переменных?
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
17.09.2018, 19:18
Цитата Сообщение от Rodriguez1 Посмотреть сообщение
Залочить тело метода на два объекта этих переменных?
Нет.

Цитата Сообщение от Rodriguez1 Посмотреть сообщение
А что в этом случае необходимо сделать?
Может, почитать «Java Concurrency in Practice»?
0
0 / 0 / 0
Регистрация: 14.06.2018
Сообщений: 16
17.09.2018, 20:34  [ТС]
Почитаю обязательно.
Но вы можете пока подсказать на словах.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.09.2018, 20:34
Помогаю со студенческими работами здесь

Промежуточное программное обеспечение Ice - применение в java
Добрый день всем. Сразу прошу извинить, если тема не в том разделе. Собственно говоря, вопрос такой - что за зверь такой Ice, и под...

Аппаратное обеспечение
Подскажите, пожалуйста, как написать, составить аппаратное обеспечение к системе, созданной в Access. Очень нужно для курсового

Программное обеспечение
Как восстановить операционную систему windows ,через базовую систему ввода-вывода bios ,если слетела ос?

Wi-Fi WiMAX ОБОРУДОВАНИЕ и обеспечение
Добрый вечер. Хочу обтянуть эти 2 городода сетью Wi-Fi и территории пром района. Общия площядь г. &quot;АААААА&quot; учитываю пром район...

Обеспечение отказоустойчивости сервера 1С
Здравствуйте! Сначала опишу текущую ситуацию: Есть windows server 2008R2, на нём запущен VirtualBox, на котором крутится 2003 с 1C 7.7, к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru