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

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

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

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

01.04.2014, 02:30. Просмотров 823. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ява потокобезопасная переменная (Программирование Android):

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

Ява такая Ява - не решается задачка. Основы - Java SE
// Задача: Ввести с клавиатуры три числа и вывести на экран среднее из них. // Программа работает и вроде бы всегда верно. // Но при...

.NET 4.x Потокобезопасная коллекция - C#
Здравствуйте, у меня следующая проблема: есть пользовательский класс Book, а также потокобезопасная коллекция BlockingCollection объектов...

Потокобезопасная очередь - Boost C++
Необходимо очередь, которая удовлетворяет следующим условиям: 1. Потокобезопасная (N писателей и один читатель) 2. Должна быть без...

Потокобезопасная очередь - C++ Qt
нужна потокобезопасная очередь с ожиданием и отказами. очередь должна быть с ограничением по размеру. видел реализацию на...

Потокобезопасная коллекция для Parallel.For - C#
Какой список выбрать для Parallel.For? Например в коллекции 1000 элементов. Хочу чтобы каждый поток брал по 10 элементов. Какую коллекцию...

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

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

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

Переменная=Документ.имя. Сделать выборку всех документов с именем Переменная - 1С
Привет всем. У меня есть проблема и варианты решения, но они не работают. Проблема вот такая: Есть переменная Документ1 в...

Модульная переменная или блочная статическая переменная: что лучше - Visual Basic .NET
Переменная (тип String) нужна на всем протяжении работы программы. Нужен совет опытных - что предпочтительнее: модульная переменная или...


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

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

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