Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
#1

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

01.04.2014, 02:30. Просмотров 782. Ответов 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)! Тоесть тормозов стало меньше, но все равно не исчезли.
Как обезопасить список обрабатываемый потоком? В Делфи было что-то вроде безопасного блока - блокируем переменную - разблокируем. Были мютексы и семафоры. Но это уже усложнения. Какой САМЫЙ ПРОСТОЙ метод приостановки потока на этапе добавления/правки записей в списке?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
name?
198 / 169 / 18
Регистрация: 01.06.2010
Сообщений: 371
Завершенные тесты: 1
01.04.2014, 09:04     Ява потокобезопасная переменная #2
использовать потокобезопасные коллекции, к примеру ArrayList заменяется на CopyOnWriteArrayList
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
01.04.2014, 12:22  [ТС]     Ява потокобезопасная переменная #3
Цитата Сообщение от name? Посмотреть сообщение
потокобезопасные коллекции
Нет! Это извращение! Мне нужно целый процедурный блок блокировать, а не саму переменную.
Мне нужно делать цикл по таблице. А не блокировать таблицу каждый раз при обращении.
Нашел конструкцию
synchronized(mTreadArr) {
...500 обращений к переменной mTreadArr вместо 500 блокировок-разблокировок...
}
Но не уверен что это сработает...
YuraAAA
1565 / 1307 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 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) {
            
        }
    }
Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
01.04.2014, 15:50     Ява потокобезопасная переменная #5
Java
1
2
private synchronized void doThreadSafe() {
}
YuraAAA
1565 / 1307 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
01.04.2014, 16:37     Ява потокобезопасная переменная #6
Netscape, можно и синхронизировать целые методы, но тогда упадёт производительность. Разумнее синхронизировать только нужные блоки.
Netscape
371 / 358 / 48
Регистрация: 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();
}
В каком случае производительность будет выше ?
YuraAAA
1565 / 1307 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
01.04.2014, 17:21     Ява потокобезопасная переменная #8
Netscape, в данном случае, я считаю, одинаково
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2014, 02:00     Ява потокобезопасная переменная
Еще ссылки по теме:

Глобальная переменная, которую можно использовать в других Activity Android
Переменная не получает отрицательное значение Android
Глобальная переменная в Java Android
Android Обмен данными между Activity (одна глобальная переменная)
BroadcastReceiver + static переменная Android

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

Или воспользуйтесь поиском по форуму:
Tester64
395 / 356 / 43
Регистрация: 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 и внутри плодят методы синхронизации.
Yandex
Объявления
02.04.2014, 02:00     Ява потокобезопасная переменная
Ответ Создать тему
Опции темы

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