| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Вопросы по многопоточности |
| Автор: Alexey91 29.7.2013, 12:40 | ||
Здравствуйте!
В данном коде создается 1000 нитей, задача каждой из которых изменять значение статической переменной result. Значение переменной result изменяется на единицу в зависимости от булевого значения переменной b. Переменная b также одна на весь класс. Я не понимаю, почему если я запускаю этот код не используя ReentrantLock, то конечное значение переменной отлично от нуля? |
| Автор: LSD 29.7.2013, 13:39 |
| Потому что b = !b и result = result + value; не атомарны. |
| Автор: Alexey91 29.7.2013, 13:49 |
| LSD, а можно подробнее? Если не хотите отвечать, так скажите где про это почитать. |
| Автор: LSD 29.7.2013, 14:53 | ||||
тут на самом деле скрыто 3 операции: чтение значения b, лгическое отрицание, запись результата. Предположим есть два потока p1 и p2, возможет такой сценарий: - p1 читает значение true из переменной - p1 инвертирует true на false - p2 читает значение true из переменной - p2 инвертирует true на false - p1 записывает в b - false - p2 записывает в b - false итого мы дважды записали в b - false (и выполнили соответсвующую ветку if), хотя должны были записать один раз false и один раз true. Аналогично и с
|
| Автор: Alexey91 25.8.2013, 15:14 | ||
| Возник вопрос. Не страшно ли использовать два synchronized блока То есть поток захватывает два объекта: synchronized(X) { synchronized(Y) { } } Я запутался. Мне говорят, что так делать нельзя, а я сделал тестовый код:
И все работает. В документации ответ не нашел. |
| Автор: Stolzen 25.8.2013, 15:19 | ||
Может быть страшно, если где-то в другом месте вы используете
Тогда вероятность возникновения дедлока высокая. |
| Автор: Alexey91 25.8.2013, 15:26 |
| Я понял! Это похоже на то, что в документации про Deadlock было написано про двух парней кланящихся друг другу... но в моем коде два раза будет встречаться synchronized(x), synchronized(y) |
| Автор: Alexey91 25.8.2013, 15:46 | ||||
А если так
Вернее у меня в методе происходит есть sync-блок. И в этом методе я вызываю другой метод, который также используют sync-блок для этого объекта:
} |
| Автор: LSD 27.8.2013, 13:18 |
Внутренний synchronized блок не имеет смысла, если можно то лучше от него избавится. Но если так просто от него не избавиться, то пусть будет, никаких проблем он не создает. |
| Автор: Alexey91 27.8.2013, 16:12 |
| Решаю следующую задачу: Существует массив элементов, который неупорядочен. Задача в том, чтобы выводить на консоль элементы массива по порядку, непрерывно, начиная с первого элемента (1,2,3,4,5,6,7) Элементы в массив могут добавляться во время упорядочивания элементов бесконечно. Поэтому он не является статическим. Если вы уже успели обработать 30 элементов массива 1,...,30, то новый добавляемый элемент не обязательно будет иметь значение 31. Он может иметь значение, например, 47. И тогда мы будем вынуждены ждать элемент со значением 31. То есть добавляемое значение идет из генератора случайных чисел. Но все элементы массива уникальные. Для решения задачи я сделал разделяемый объект, который хранит значение текущего элемента, которое нужно вывести на экран. С самого начала работы он равен 1 И из главного потока записал в локальные массивы N / (T - число потоков) элементов. В свою очередь в цикле каждой нити происходит проверка на то, что элемент из массива нити равен значению разделяемого объекта, и если да, то значение из массива выводится на экран, и значение разделяемого объекта увеличивается на единицу. Можно ли как-то организовать этот процесс быстрее? Потому что разделения обработки на потоки выигрыша не вижу. Примерно одно время выполнения, что при одной, что при десяти нитях. |
| Автор: Mirkes 28.8.2013, 14:56 |
| Попробуйте четко сформулировать задачу. Честно говоря ничего не понял. Есть массив или последовательность, генерируемая на лету? Массив надо отсортировать, или просто вывести на консоль подряд все натуральные числа которые обладают следующими свойствами: 1. Число N присутствует в уже полученной части последовательности 2. Все натуральные числа меньшие N уже выводились на печать. Хотя не понимаю целей. Если все генерируемые числа принадлежат диапазону от 1 до M, то рано или поздно будут выведены все числа из этого диапазона. На самом деле, сформулируйте задачу. |
| Автор: LSD 28.8.2013, 15:18 |
| Присоеденюсь к Mirkes, из этой формулировки ничего непонятно. |
| Автор: Alexey91 28.8.2013, 20:41 |
| ок.. |