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

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

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

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

01.04.2014, 02:30. Просмотров 796. Ответов 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)! Тоесть тормозов стало меньше, но все равно не исчезли.
Как обезопасить список обрабатываемый потоком? В Делфи было что-то вроде безопасного блока - блокируем переменную - разблокируем. Были мютексы и семафоры. Но это уже усложнения. Какой САМЫЙ ПРОСТОЙ метод приостановки потока на этапе добавления/правки записей в списке?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.04.2014, 02:30     Ява потокобезопасная переменная
Посмотрите здесь:

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

Переменная прозрачность в диалоге - Программирование Android
Можно ли штатными средствами сдалать такое: маленький диалог - форма с двумя кнопками ДА и НЕТ. Форма полупрозрачная, а кнопки нет!...

Переменная типа Uri - Программирование Android
программа у меня при запуске предлагает выбрать фото из произвольного местал, после выбора я получаю fileUri тип этой переменной Uri, но...

Глобальная переменная в Java - Программирование Android
Подскажите нубу. Недавно начал изучать Java. У меня в методе onClick есть свич для обработки кнопок. Вот отрывок для одной кнопки: public...

BroadcastReceiver + static переменная - Программирование Android
Работая с бродкаст ресивером задался вопросом, как же он всё-таки работает?) Есть следующий код, который фиксирует состояние телефонного...

SetOnClickListener исчезает глобальная переменная - Программирование Android
Помогите исчезает глобальная переменная //Здесь переменная выводится нормально Log.d(LOG_TAG, &quot;Моя переменная&quot;+tehGuid); ...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
1567 / 1309 / 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
1567 / 1309 / 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
1567 / 1309 / 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     Ява потокобезопасная переменная
Еще ссылки по теме:

Переменная не получает отрицательное значение - Программирование Android
Всем привет! Если эта тема уже была то извиняюсь, просто даже не знаю как её прогуглить гуглить Имеется код Random randproc =...

Переменная в адресе для WebView - Программирование Android
Доброго времени суток, Коллеги! Есть Активити с WebView, есть набор HTML файлов, задача при нажатии на нужную кнопку открывать Активити с...

String-array resources, как глобальная переменная - Программирование Android
Требуется помощь! У меня есть 16 массивов &lt;string-array&gt;, в активити, когда я хочу обратится к ним, прописывать для каждого ...

Получить первую букву из слова (переменная String) - Программирование Android
есть переменная String &quot;word&quot;. Как получить первую букву w? Добавлено через 7 минут вот это ошибку выбивает charAt(int index) -...

Глобальная переменная, которую можно использовать в других Activity - Программирование 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