﻿<?xml version='1.0' encoding='UTF-8'?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Релиб / Программирование / Java  / Threads и ArrayList / Latest Posts</title><generator>InstantForum.NET v4.1.4</generator><description>Релиб</description><link>http://relib.com/forums/</link><webMaster>robot@relib.com</webMaster><lastBuildDate>Sun, 07 Sep 2008 22:57:47 GMT</lastBuildDate><ttl>20</ttl><item><title>RE: Threads и ArrayList</title><link>http://relib.com/forums/Topic903273-5-1.aspx</link><description>При использовании структур типа Collections.&lt;B style="COLOR: black; BACKGROUND-COLOR: #99ff99"&gt;synchronizedList&lt;/B&gt;(...  создается wrapper класс, который инкапсюлирует состояние state и синхранизирует каждый public метод, т.е. только одна thread в каждый момент времени может иметь доступ к полям state. Другими словами, доступ к элементам синхронизирован. Однако, остается проблема синхронизации при использовании итератора. Например, если кол-во элементов изменится при итерации, о возникнет ConcurrentModificationException. Поэтому необходимо также синхронизоваться по самой коллекции, то несет потерю производительности.&lt;/P&gt;&lt;P&gt;Можно конечно, создать клон коллекции и производить иттерации по по клону. Т.к. клон является "thread-confined" , т.е. только одна thread работает с клоном. Но здесь тоже проблемы с производительностью в зависимости от размера коллекции.&lt;/P&gt;&lt;P&gt;List&amp;lt;Widget&amp;gt; widgetList = Collections.synchronizedList(new ArrayList&amp;lt;Widget&amp;gt;());&lt;/P&gt;&lt;P&gt;synchronized(widgetList) {&lt;/P&gt;&lt;P&gt;  for (Widget w: widgetList)&lt;/P&gt;&lt;P&gt;     doSmthing(w);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;Другие методы связаны с Concurrent collections. Там "вшит" механизм на основе finer-grained locking.&lt;/P&gt;&lt;P&gt;Есть еще CopyOnWriteArrayList это по существу некоя замена synchronizedList c лучшей производительностью.&lt;/P&gt;&lt;P&gt;Рукомендую книжку Brian Goetz  Java concurrency in practice. Конечно занудная местами, но информативная.&lt;/P&gt;&lt;P&gt;Кстати, ее не помешало бы почитать всем нашим "великим" практикам из всем известным финансовых и других организации.</description><pubDate>Wed, 04 Jul 2007 18:21:05 GMT</pubDate><dc:creator>ASPushkin</dc:creator></item><item><title>RE: Threads и ArrayList</title><link>http://relib.com/forums/Topic903273-5-1.aspx</link><description>Видит бог, не бросал я камней =))</description><pubDate>Mon, 28 Aug 2006 17:44:46 GMT</pubDate><dc:creator>Danissimo</dc:creator></item><item><title>RE: Threads и ArrayList</title><link>http://relib.com/forums/Topic903273-5-1.aspx</link><description>P.S. и вообще, если бы был конкретно приведен пример задачи (возможно даже с кусочком кода), то можно было бы помочь человеку расставить модификаторы и операторы synchronized, а так, было лишь упоминание об ArrayList, самый прямой путь по синхроницазции списка (самого списка, а не его содержимого) - это использовать методы класса Collection, ну или воспользоваться уже синхронизированным списком: Vector</description><pubDate>Mon, 28 Aug 2006 13:30:22 GMT</pubDate><dc:creator>boombastik</dc:creator></item><item><title>RE: Threads и ArrayList</title><link>http://relib.com/forums/Topic903273-5-1.aspx</link><description>Вот это "Есть!!! Еще одна рыбка попалась на эту удочку =))) (без обид)" я расценил как камешек в мой огород, опираясь на дальнейшие разъяснения. Если это не так, то приношу свои извинения, других обвинений в вашем сообщении не было, далее шли технические разъяснения, которые я прекрасно понял.&lt;br&gt;&lt;br&gt;НО, если честно, то я не уверен, что начинающий поймет, о чем вы говорите. Тема синхорнизированного доступа к общим ресурсам из 2-х независимых потоков, способы изменения таких ресурсов: оптимистичный, пессимистичный, блокировка ресурсов, проблемы dead-lock'ов, все это слишком много для конкретной темы форума.&lt;br&gt;&lt;br&gt;Согласен, человек задающий вопрос выглядит действительно начинающим, но в данном случае проще порекомендовать ему литературу или позволить самостоятельно учиться на своих ошибках или хотя бы дождаться, пока он начнет правильно формулировать вопросы, тогда можно будет давать ему правильные ответы ;)&lt;br&gt;&lt;br&gt;С уважением,&lt;br&gt;Владимир</description><pubDate>Mon, 28 Aug 2006 13:25:07 GMT</pubDate><dc:creator>boombastik</dc:creator></item><item><title>RE: Threads и ArrayList</title><link>http://relib.com/forums/Topic903273-5-1.aspx</link><description>Погоди-погоди. Ни кого не обвинял. Честно говоря, перечитав мой пост, не могу найти место, которое можно расценивать, как обвинение. Да и вообще не люблю обвинять тех, кто чего-то не знает, но стремится узнать. Сам много чего не знаю, и с удовольствием учусь.&lt;br&gt;&lt;br&gt;Согласен, в первоначальной постановке ничего не говорилось об изменении значений. Согласен, что synchronizedList() решает задачу. Тока смотри, я ж говорил, что не рекомендую им пользоваться, пока четко не научишься управлять доступом к критичеким ресурсам. Но это не означает, что им пользоваться нельзя. Можно, тока на перавых порах не нужно.&lt;br&gt;&lt;br&gt;К тому же, что у нас является наиболее распространенным сценарием? Правильно, чтение-модификация-запись. А при таком сценарии synchronizedList() не помощник. Получается, что в любом случае приходится вручную управлять доступом. Так зачем же лишний synchronized, присутствующий в synchronizedList()?&lt;br&gt;&lt;br&gt;Вот такие соображения =))</description><pubDate>Mon, 28 Aug 2006 13:09:52 GMT</pubDate><dc:creator>Danissimo</dc:creator></item><item><title>RE: Threads и ArrayList</title><link>http://relib.com/forums/Topic903273-5-1.aspx</link><description>Danissimo, ты прав в своих заявлениях, но ты не прав в своих обвинениях, рекомендуя использовать Collections.synchronizedList() я опирался на заданный вопрос. Цитирую:&lt;br&gt;&lt;br&gt;"Создаю один глобальный ArrayList&lt;br&gt;потоки работают полностью независимо друг от друга и пишут результаты - add все в один этот аррайлист.&lt;br&gt;Это нормально?"&lt;br&gt;&lt;br&gt;Про модификацию значений занесенных в список никаких коментариев и вопросов не было.&lt;br&gt;&lt;br&gt;А так, все, что ты сказал - верно. С потоками вообще надо быть осторожным, нужно четко представлять что происходит. Впрочем даже имея полное представление частенько совершаешь ошибки по неусмотрению.&lt;br&gt;&lt;br&gt;С уважением,&lt;br&gt;Владимир</description><pubDate>Mon, 28 Aug 2006 12:47:58 GMT</pubDate><dc:creator>boombastik</dc:creator></item><item><title>RE: Threads и ArrayList</title><link>http://relib.com/forums/Topic903273-5-1.aspx</link><description>Есть!!! Еще одна рыбка попалась на эту удочку =))) (без обид)&lt;br&gt;&lt;br&gt;Два момента:&lt;br&gt;  - Collections.synchronizedList() использовать можно, но осторожно (см. ниже);&lt;br&gt;  - у тебя задача шире, чем просто безопасное добавление к списку.&lt;br&gt;&lt;br&gt;Collections.synchronizedList(), а также Vector, действительно позволяют модифицировать список безопасно. Подчеркиваю, модифицировать СПИСОК, а не ЗНАЧЕНИЯ его элементов.&lt;br&gt;&lt;br&gt;Ты же пытаешься модифицировать значения элементов. В этом случае все эти игры со статиками, векторами и synchronized листами не проходят =)). Именно пожтому я настоятельно рекоммендую выработать привычку не пользоваться ими (когда привычка выработана, то можно =)).&lt;br&gt;&lt;br&gt;У тебя возникает та же самая проблема, что и у двух людей, редактирующих в блокноте один и тот же файл ОДНОВРЕМЕННО. Действует несколько видоизмененный закон общаги (кто первый встал, того и тапки): кто последний записал свои изменения, то и прав. То есть последний затирает изменения всех предыдущих, редактировавших одновременно с ним.&lt;br&gt;&lt;br&gt;Как лечить? Очень просто. Сделай изменение ЗНАЧЕНИЯ атомарным. Другими словами, операция чтение-модификация-запись, должна быть атомарной.&lt;br&gt;&lt;br&gt;Вуаля =))</description><pubDate>Fri, 25 Aug 2006 22:20:44 GMT</pubDate><dc:creator>Danissimo</dc:creator></item><item><title>RE: Threads и ArrayList</title><link>http://relib.com/forums/Topic903273-5-1.aspx</link><description>Nada nada escho kak nada&lt;br&gt;inache poluchish iskluchenie.&lt;br&gt;</description><pubDate>Fri, 25 Aug 2006 19:58:56 GMT</pubDate><dc:creator>mishgun</dc:creator></item><item><title>RE: Threads и ArrayList</title><link>http://relib.com/forums/Topic903273-5-1.aspx</link><description>Как интересно!&lt;br&gt;ну то есть дополнительных усилий по синхронизации типа инт прилагать не надо?</description><pubDate>Fri, 25 Aug 2006 13:12:48 GMT</pubDate><dc:creator>vlav</dc:creator></item><item><title>RE: Threads и ArrayList</title><link>http://relib.com/forums/Topic903273-5-1.aspx</link><description>Хе-хе, так как атрибут класса не объявлен с модификатором static, то каждый поток создает свой собственный экземпляр этого атрибута, соответственно внутри каждого потока атрибут изначально инициализируется со значением 0, инкриментируется один раз и выводится в system output со значением 1.&lt;br&gt;&lt;br&gt;Тебе надо просто объявить атрибут следующим образом:&lt;br&gt;static int ind=0;&lt;br&gt;&lt;br&gt;Удачи,&lt;br&gt;Владимир</description><pubDate>Fri, 25 Aug 2006 11:45:15 GMT</pubDate><dc:creator>boombastik</dc:creator></item></channel></rss>