Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
#1

Ява потокобезопасная переменная

01.04.2014, 02:30. Просмотров 907. Ответов 8
Метки нет (Все метки)

Помогите пожалуйста с теорией потоко-безопасных переменных! Основы знаю(для Делфи учил), но на практике (в яве) еще не применял...

Есть обычный поток:
Java
1
2
3
4
5
        Tread1 = new Thread(new Runnable() { public void run() {
            Tread_Runed = true;
            Tread1_Body();
        }});
        Tread1.start();
В теле перебираю список-таблицу
private ArrayList<Tread_ListItem> mTreadArr = new ArrayList<Tread_ListItem>();
и удаляю устаревшие записи.
Есть public процедура для добавления в список новых записей (кнопкой/реактором пользователя).
Что-бы не менять запись одновременно, защищал список через
Java
1
2
    private Handler Tread1_Handler = new Handler();
        Tread1_Handler.post(new Runnable() { public void run() {
но если я правильно понял это синхронизирует не с этим потоком а через главный поток (UI)! Тоесть тормозов стало меньше, но все равно не исчезли.
Как обезопасить список обрабатываемый потоком? В Делфи было что-то вроде безопасного блока - блокируем переменную - разблокируем. Были мютексы и семафоры. Но это уже усложнения. Какой САМЫЙ ПРОСТОЙ метод приостановки потока на этапе добавления/правки записей в списке?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.04.2014, 02:30
Ответы с готовыми решениями:

Нужен простой пример программы на ява приложения для дипломной
пора уже выбирать тему дипломной) интересно было поюзать язык ява, а именно...

Ява такая Ява - не решается задачка. Основы
// Задача: Ввести с клавиатуры три числа и вывести на экран среднее из них. //...

Потокобезопасная коллекция
Здравствуйте, у меня следующая проблема: есть пользовательский класс Book, а...

Потокобезопасная очередь
нужна потокобезопасная очередь с ожиданием и отказами. очередь должна быть с...

Потокобезопасная очередь
Необходимо очередь, которая удовлетворяет следующим условиям: 1....

8
name?
198 / 169 / 52
Регистрация: 01.06.2010
Сообщений: 371
Завершенные тесты: 1
01.04.2014, 09:04 #2
использовать потокобезопасные коллекции, к примеру ArrayList заменяется на CopyOnWriteArrayList
0
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
01.04.2014, 12:22  [ТС] #3
Цитата Сообщение от name? Посмотреть сообщение
потокобезопасные коллекции
Нет! Это извращение! Мне нужно целый процедурный блок блокировать, а не саму переменную.
Мне нужно делать цикл по таблице. А не блокировать таблицу каждый раз при обращении.
Нашел конструкцию
synchronized(mTreadArr) {
...500 обращений к переменной mTreadArr вместо 500 блокировок-разблокировок...
}
Но не уверен что это сработает...
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
01.04.2014, 15:24 #4
Tester64,


Java
1
2
3
4
5
6
7
8
    public static final Object MUTEX = new Object();
    
    
    private void doThreadSafe() {
        synchronized (MUTEX) {
            
        }
    }
0
Netscape
374 / 361 / 52
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
01.04.2014, 15:50 #5
Java
1
2
private synchronized void doThreadSafe() {
}
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
01.04.2014, 16:37 #6
Netscape, можно и синхронизировать целые методы, но тогда упадёт производительность. Разумнее синхронизировать только нужные блоки.
0
Netscape
374 / 361 / 52
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
01.04.2014, 17:01 #7
YuraAAA, разумнее использовать lock-free структуры данных.
А так-то, ничего никуда не упадет, подозреваю, что вся работа все равно будет выполнена в синхронизированном блоке. Т.е. будет что-то типа:
Java
1
2
3
4
5
6
7
    public static final Object MUTEX = new Object();
   
    private void doThreadSafe() {
        synchronized (MUTEX) {
            doHardWord();
        }
    }
против
Java
1
2
3
private synchronized void doThreadSafe() {
    doHardWord();
}
В каком случае производительность будет выше ?
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
01.04.2014, 17:21 #8
Netscape, в данном случае, я считаю, одинаково
0
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
02.04.2014, 02:00  [ТС] #9
Эх! Запутали окончательно... В делфи все было так просто... всего 30-40 страниц A4 в распечатке мелким шрифтом... А по яве нашел целых 6-8 отсканеных страниц (небольшой книжки Г.Шилд по яве) - мутных обьяснений в учебнике по яве (в PDF). Причем одних примеров почти без без обьяснений теории...

В public static final Object MUTEX = new Object();
Мютексом обозвали зачем? Это может быть любой обьект? Даже сама таблица которую блокирую? Почему статик и финал? Приватной обычной быть не может? Выдаст ошибку или просто работать не будет?

Видел когда-то реальные семафоры в гугл коде, но вычитывать мутные обьяснения без надобности поленился( http://developer.android.com/referen...Semaphore.html )

private void doThreadSafe() { - без контекста не понятно что за процедура? Многие примеры показывают наследника от Tread и внутри плодят методы синхронизации.
0
02.04.2014, 02:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2014, 02:00

Потокобезопасная коллекция для Parallel.For
Какой список выбрать для Parallel.For? Например в коллекции 1000 элементов....

Потокобезопасная очередь: критика реализации
Прочитал третью часть &quot;Уильямс Э. &quot;Параллельное программирование на С++ в...

Потокобезопасная организация доступа к одному XML файлу на харде из разных потоков через QXmlStreamReader
Hail to the King baby! :) Как лучше организовать безопасный доступ на чтение и...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru