Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> volatile or synchronized 
V
    Опции темы
duk
Дата 4.2.2008, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Some Object
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 19.7.2007

Репутация: 4
Всего: 4



каким образом volatile выполняет свои функции. Тоесть с synchronized все ясно, пока какой-то блок или функция не отработает остальные потоки в это время ожидают. а как определяется возможность изменения состояния объекта при использовании поля volatile
PM MAIL   Вверх
Tamerlann
Дата 5.2.2008, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 10.11.2002
Где: Минск, Беларусь

Репутация: 2
Всего: 2



volatile дает знать виртуальной машине знать, что для этой переменной не нужно выполнять некоторые виды оптимизаций. В конечном счете это приводит так же к тому, что в многопоточном приложении при доступе к переменной ее значение всегда будет актуальным. Иными словами, это тоже способ синхронизации значения переменной. НО!

1. Некоторые виртуальные машины просто игнорируют это ключевое слово
2. Реально синхронизируется ведь только значение переменной! Т.е. если переменная не примитивная, то, очевидно, ничто не мешает делать не синхронизированные вызовы метод объекта переменной.

Поэтому, на мой взгляд, этим ключевым словом лучше не пользоваться вовсе. Синхронизацию нужно выполнять с помощью synchronized.

Это сообщение отредактировал(а) Tamerlann - 5.2.2008, 00:10
--------------------
http://timursdev.blogspot.com/ 
PM MAIL WWW Skype   Вверх
duk
Дата 5.2.2008, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Some Object
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 19.7.2007

Репутация: 4
Всего: 4



Tamerlann, но все же если мы используем блокирование то четко видно в каком месте кода поток прерваться не может. А при использовании volatile а не могу понять каким образом присходит. Например мы считали значение, провели какие-то расчеты, в это время поток приостановился значение данного поля изменилось, и для первого потока оно уже не актуальное.
Меня просто интересует принцип работы (для общего развития). Пытался прочитать на англиском но четких пунктов для себя так и не смог выявить. Если объяснишь буду благодарен.
PM MAIL   Вверх
Sardar
Дата 5.2.2008, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



volatile переменные это не средства синхронизации, есть только гарантия, что в момент чтения ты всегда будешь получать актуальное значение. Это также значит, что если в выражении эта переменная встречается несколько раз, то столько же раз она будет опрошена из памяти и следовательно в любой момент может изменится, посреди выражения. Больше никаких гарантий нет, если устареет твоё значение, значит так тому и быть smile

Думаю в 70% случаев когда используют volatile она в действительности не нужна, ибо это зло.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Tamerlann
Дата 5.2.2008, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 10.11.2002
Где: Минск, Беларусь

Репутация: 2
Всего: 2



В том то и дело, что для любого потока занчение переменной всегда будет актуально. Даже если выполнение одного потока прервалось, и второй поток изменил значение переменной, то когда продолжит выполняться первый поток - значение переменной будет актуально.

Чтобы понять как это достигается, скорее нужно понять почему может произойти обратное. Т.е. почему может произойти "рассинхронизация"? Рассинхронизация происходит потому что каждый поток может иметь свой кэш для хранения текущих значений переменных. Например, если посмотреть с "железной" стороны - текущее значение может храниться в регистре одного из процессоров, который и выполняет текущий поток. 

volatile должен указывать VM, чтобы она всегда хранила значение переменной в "общей" памяти, а не в кэше. Таким образом, какой бы поток не получал значение переменной - он всегда обращается к "общей" памяти VM и, соотвественно, получает актуальное ее значение.

Добавлено через 14 минут и 18 секунд
Если я правильно понял вопрос, то вот продолжение:

Имеем код:

Код

pulbic volatile int x = 0;

void foo()
{
  x = abc();
  if (someCondidtion()) {
    x += x * 5 + xyz();
  }
}


разумеется, нет никакой гарантии, что какой-либо другой поток не залезет между строками 5 и 7 и не изменит занчение x. Наоборот, если это произойдет, то значение переменной x будет таким, какое оно получилось после выполнения операций в другом потоке. 

Поэтому:
1. Не надо открывать паблик доступ к таким переменным.
2. Надо синхронизировать код, изменяющий значение таких переменных.

Это сообщение отредактировал(а) Tamerlann - 5.2.2008, 01:07
--------------------
http://timursdev.blogspot.com/ 
PM MAIL WWW Skype   Вверх
w1nd
Дата 5.2.2008, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Цитата(Sardar @  5.2.2008,  00:59 Найти цитируемый пост)
Думаю в 70% случаев когда используют volatile она в действительности не нужна, ибо это зло.

Откуда свалилось такое компетентное мнение?

Цитата(Tamerlann @  5.2.2008,  00:08 Найти цитируемый пост)
Некоторые виртуальные машины просто игнорируют это ключевое слово

Такие виртуальные машины не являются полноценными, только и всего. 

Цитата(Tamerlann @  5.2.2008,  00:08 Найти цитируемый пост)
Поэтому, на мой взгляд, этим ключевым словом лучше не пользоваться вовсе. Синхронизацию нужно выполнять с помощью synchronized.

Странная рекомендация. Модификатор volatile имеет вполне определённое назначение и не пользоваться им в некоторых ситуациях попросту не удастся. Данный тип переменных является свойственным отнюдь не для java, а для любой многопоточной среды. Другой вопрос - с синхронизацией сценарии его использования действительно имеют мало общего.

Добавлено @ 01:50

Цитата(Tamerlann @  5.2.2008,  01:06 Найти цитируемый пост)
Надо синхронизировать код, изменяющий значение таких переменных.

Далеко не всегда оправданная стратегия. Так как все операции в java атомарны, нет ничего зазорного в том, чтобы просто получать актуальное состояние переменной, тогда как инициатор этого изменения не важен.

Это сообщение отредактировал(а) w1nd - 5.2.2008, 01:51


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Sardar
Дата 5.2.2008, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Цитата(w1nd @  5.2.2008,  00:48 Найти цитируемый пост)
Откуда свалилось такое компетентное мнение?

Первое слово "думаю", впечатление сложилось перебирая прошлогодние лабы по concurrency.

Цитата(w1nd @  5.2.2008,  00:48 Найти цитируемый пост)
Данный тип переменных является свойственным отнюдь не для java, а для любой многопоточной среды.

Volatile к многопоточной среде не имеет никакого отношения. Изначально штука создавалась для считывания регистров различных девайсов, корнями уходит в C. В современном мире даже явные блокировки (семафоры, мониторы etc) уже считаются не удобными/устаревшими, за этим должен следить компилер. Программист должен использовать функции без side-effects и не изменяемые "переменные", на манер того как это делает Erlang. Другими словами "переменная" не должна изменятся, должна создаваться её новая копия и тем более не должны быть переменные, что могут сами внезапно изменится. Иначе появляется весь букет проблем, race-conditions, deadlocks, излишние не явные случайные блокировки, из-за которых совершенно случайно может упасть производительность и.т.п. Венцом конечно будет крайне плохо оптимизируемая работа с памятью.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
w1nd
Дата 5.2.2008, 02:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Цитата(Sardar @  5.2.2008,  02:04 Найти цитируемый пост)
Volatile к многопоточной среде не имеет никакого отношения. Изначально штука создавалась для считывания регистров различных девайсов, корнями уходит в C. В современном мире даже явные блокировки (семафоры, мониторы etc) уже считаются не удобными/устаревшими, за этим должен следить компилер.

Также как к многопоточной и многопроцессорной среде не имеют отношения потоки вообще. Смешно. В современном мире процессоры пока остаются принципиально такими же, какими были и десяток-другой лет назад. Отслеживание всех возможных коллизий компилятором (а на самом деле - банальная безусловная блокировка на каждый чих) в первую очередь приведёт к снижению производительности в многопоточных и многопроцессорных системах на порядки.

Volatile-переменная - это такая переменная, буферизация которой исполняющей средой или процессором недопустима. ВСЁ. И отношение к многопроцессорной и многопоточной среде этот модификатор имеет самое непосредственное - потрудитесь вспомнить о том, что упомянутые вами девайсы работали асинхронно с процессором.

Это сообщение отредактировал(а) w1nd - 5.2.2008, 02:26


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Sardar
Дата 5.2.2008, 03:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Цитата(w1nd @  5.2.2008,  01:17 Найти цитируемый пост)
Отслеживание всех возможных коллизий компилятором (а на самом деле - банальная безусловная блокировка на каждый чих) в первую очередь приведёт к снижению производительности в многопоточных и многопроцессорных системах на порядки.

Советую расширить кругозор, желательно пройти курс concurrency в любом (нормальном) универе. Да, критические секции ещё используются (но не на высокоэффективных распределённых системах), но за этим следит компилер, который действительно использует минимум подобных исключений (иногда ошибка синхронизации настолько не существенна, что и критические секции отменяются). Компилер это делает гораздо эффективней, чем человек (чел. ленив по определению), цена этому конечно свобода. Чем больше свободы у человека, тем меньше возможности компилятора для оптимизаций. Именно поэтому строят высокоуровневые языки, где многие вещи решаются однотипно, чуть ли не по сценарию, полностью абстрагируясь от внутреннего устройства/реализации. Пример, тот же Erlang, где не используются прямые блокировки, расшаренная память и т.п.

Цитата(w1nd @  5.2.2008,  01:17 Найти цитируемый пост)
И отношение к многопроцессорной и многопоточной среде этот модификатор имеет самое непосредственное

Volatile переменная зачастую использовалась для busy-waiting'овых циклов ожидания до устройства. Почти всегда необходимое состояние на железном регистре приходило в короткое время, поэтому иногда в таком цикле отключали прерывания (что конечно криво), т.е. "многопоточность" могла "отключиться" либо её вообще не использовали по дизайну. У меня первый диплом в этой области  smile 
К организации или управлению многопоточностью volatile переменные не применялись. 

Вообще в многопоточной системе есть пара основных принципов:
  • все значения immutable (не меняются)
  • любое изменение состояния есть копирование значения с изменением. Все процессы при этом продолжают ссылаться на старое значение
  • отсутствие явного освобождения памяти, только сборщик мусора или не явные "бесконечные ленты".
  • все функции без side-effects, т.е. поведение функции детерминированное и зависит только от аргументов (в чистых функциональных языках типа Haskell функции с side-effects элегантно решаются посредством монад)
  • отсутствие прямой блокировки, взаимодействие только посредством (возможно буфферезуемых) сообщений

Только так можно построить высокоэффективную (читай быструю) систему, без ошибок, без deadlock'ов и реально масштабируемую (без большого overhead'а из-за многопоточности). Мы говорим о реальных результатах/академической корректности, а не о практике, деньгах и хорошем маркетинге ;-)

Всё, наша дискуссия исчерпала себя, продолжение можно найти в PM. Эту тему засорять не стоит.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Platon
Дата 5.2.2008, 11:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Нет уж! Никаких ПМов, народу (мне) интересно!
PM MAIL ICQ   Вверх
Kangaroo
Дата 5.2.2008, 11:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 21
Всего: 104



Цитата(Platon @  5.2.2008,  10:18 Найти цитируемый пост)
Нет уж! Никаких ПМов, народу (мне) интересно! 

Поддерживаю. Нечего скрывать драгоценные знания от народа  smile 


--------------------
Lost....
PM MAIL MSN   Вверх
w1nd
Дата 5.2.2008, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Цитата(Sardar)
Советую расширить кругозор, желательно пройти курс concurrency в любом (нормальном) универе. Да, критические секции ещё используются (но не на высокоэффективных распределённых системах), но за этим следит компилер, который действительно использует минимум подобных исключений (иногда ошибка синхронизации настолько не существенна, что и критические секции отменяются). Компилер это делает гораздо эффективней, чем человек (чел. ленив по определению), цена этому конечно свобода. Чем больше свободы у человека, тем меньше возможности компилятора для оптимизаций. Именно поэтому строят высокоуровневые языки, где многие вещи решаются однотипно, чуть ли не по сценарию, полностью абстрагируясь от внутреннего устройства/реализации. Пример, тот же Erlang, где не используются прямые блокировки, расшаренная память и т.п.

Встречный совет - спуститься с небес на грешную землю. Компилятор по определению не может управлять подобными подсистемами эффективнее человека, тем более без изменения уровня абстракций. Да, желание избежать влияния человеческого фактора понятно, но принципиально нереализуемо - это доказывает уже многолетняя практика создания ПО во всём мире. Языки, в которых будут реализованы описанные стратегии, станут эффективны лишь тогда, когда производительность железа возрастёт на порядок.

Цитата(Sardar)
К организации или управлению многопоточностью volatile переменные не применялись. 

Я не припоминаю, чтобы говорил о управлении или организации многопоточностью с помощью volatile-переменных. Вы уже не приписывайте мне свои фантазии. Я говорил о таком типе переменных, как о непременном атрибуте многопоточных и многопроцессорных сред. Как раз для ситуаций, когда упомянутые вами "основные принципы" исключают или затрудняют возможность реализации задачи.

Вообще, смешно читать о гипотетическом многопоточном окружении, где не используются блокировки и разделяемая память. Это всё будет использоваться ВСЕГДА, вопрос только - явно или не явно. Для того, чтобы избежать явного управления некоторыми процессами (дабы исключить грубые ошибки), следует искоренить всякую возможность взаимодействия с этими процессами, кроме конфигурационного управления. Платой за такой подход неизбежно станет потеря эффективности, а уж о том, что все эти песни не про java - и не говорю.

Цитата(Sardar @  5.2.2008,  03:10 Найти цитируемый пост)
Volatile переменная зачастую использовалась для busy-waiting'овых циклов ожидания до устройства. Почти всегда необходимое состояние на железном регистре приходило в короткое время, поэтому иногда в таком цикле отключали прерывания (что конечно криво), т.е. "многопоточность" могла "отключиться" либо её вообще не использовали по дизайну.

Это вас куда-то в сторону занесло, volatile-переменные - это всегда такие данные, которые бесконтрольно могут меняться извне, смысл от контекста применения не меняется.

Добавлено @ 13:40

Цитата(Kangaroo @  5.2.2008,  11:21 Найти цитируемый пост)
Нечего скрывать драгоценные знания от народа

Ну, все сведения по вопросу уже представлены, началась уже банальная фаллометрия smile 

Это сообщение отредактировал(а) w1nd - 5.2.2008, 13:47


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Sardar
Дата 5.2.2008, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Цитата(w1nd @  5.2.2008,  12:26 Найти цитируемый пост)
Языки, в которых будут реализованы описанные стратегии, станут эффективны лишь тогда, когда производительность железа возрастёт на порядок.

Достаточно голословное утверждение. Можешь провести тесты и убедится, что встроенные в язык решения всегда быстрей, чем аналогичное "в ручную" (извиняюсь, тоже голословное, результаты тестов потерял). Всё это от лени, человек всегда ищет чего попроще. К примеру создание треда в C - чуть ли не подвиг, из-за постоянных locks треды работают жутко не эффективно (не только ожидание критической секции, но и сбросы кеша и т.п.), почти всегда в новых тредах/подпроцессах запускается единый однотипный хендлер (ftp/http сервер, тред обслуживающий запрос). Теперь сравни как работает с тредами Mozart/OZ, треды на столько дешёвые, что любое событие/сообщение отрабатывается в отдельном треде. Мы говорим о реально сотнях/тысячах кратко-живущих тредов, идеальная среда для сетки Cell процессоров. Из-за жёстких ограничений в языке можно гарантировать целостность состояния в run-time, исключаются блокировки, что делает возможным просто "запустить тред", который эффективно отработает как у себя (parallelized) , так и на чужой машине (distributed). Человек в ручную просто не способен уследить за всем этим и глупо даже пытаться, человек должен видеть только общую картину.

Да, я верю, что и на асме вы способны написать аналог Eclipse, а полностью распределённые fault tolerant приложения, где каждая мелкая операция выливается в не один десяток строк вызовов низкоуровневого API - для вас лишь детская игра. К сожалению других таких нет, мы простые люди не способны удержать полную структуру программы в голове, учитывая что она ещё зависит от конкретной среды исполнения  smile 


Цитата(w1nd @  5.2.2008,  12:26 Найти цитируемый пост)
Я говорил о таком типе переменных, как о непременном атрибуте многопоточных и многопроцессорных сред. Как раз для ситуаций, когда упомянутые вами "основные принципы" исключают или затрудняют возможность реализации задачи.

Volatile переменная - не стабильна по определению. Она меняется в любой момент, в принципе основное её использование - ожидание хардварного статуса. В нормальных многопоточных средах нет volatile переменных, т.к. они нарушают основной принцип no side-effects. Попробуйте придумать хоть один сценарий, когда volatile переменная могла бы понадобится?

Опережу, организовывать конец основного цикла треда через volatile переменную - есть полнейшая глупость. Нет необходимости мгновенно останавливать тред, ценой жуткой потери производительности (помним что современный проц работает в 12+ раз быстрее памяти, это не учитывая разного рода ожидания и bus-lock'и, особенно в многоядерных системах). Убери свойство volatile у переменной и заметишь, что прога по прежнему хорошо работает. А потому что есть гарантия, что переменная рано или поздно обновится, все треды, рано или поздно возьмут актуальное значение. Пусть тред завершится на пару миллисекунд позже, но зато в процессе работы он будет в десяток раз быстрее. Что важно, корректность программы сохраняется.

Какие ещё будут примеры?


P.S. 2w1nd, если хочешь, будем беседовать без "подколок", народу читать будет приятней. Но что бы было продуктивно, давай примеры и ссылки на свои утверждения.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
duk
Дата 5.2.2008, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Some Object
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 19.7.2007

Репутация: 4
Всего: 4



Спасибо всем, кто поучаствовал в обсуждении. Вы мне помогли.

Привожу инфу, которую я нашел по этой теме (может кому-то будет полезной):

• use - чтение значения переменной из рабочей памяти потока
• assign - запись значения переменной в рабочую память потока
• read - получение значения переменной из основного хранилища
• load - сохранение значения переменной, прочитанного из основного хранилища, в
рабочей памяти
• store - передача значения переменной из рабочей памяти в основное хранилище для
будущего сохранения
• write - сохраняет в основном хранилище значение переменной, переданной командой
store

При объявлении полей объектов и классов может быть указан модификатор volatile. Он
устанавливает более строгие правила работы со значениями переменных.
Если поток собирается выполнить команду use для volatile переменной, то требуется,
чтобы предыдущим действием над этой переменной было обязательно load, и наоборот
- операция load может выполняться только перед use. Таким образом, переменная и
главное хранилище всегда имеют самое последнее значение этой переменной.
Аналогично, если поток собирается выполнить команду store для volatile переменной, то
требуется, чтобы предыдущим действием над этой переменной было обязательно assign,
и наоборот - операция assign может выполняться только если следующей будет store.
Таким образом, переменная и главное хранилище всегда имеют самое последнее значение
этой переменной.
Наконец, если проводятся операции над несколькими volatile переменными, то передача
соответствующих изменений в основное хранилище должно проводится строго в том же
порядке.
При работе с обычными переменными компилятор имеет больше пространства для маневра.
Например, при благоприятных обстоятельствах может оказаться возможным предсказать
значение переменной, заранее вычислить и сохранить его, а затем в нужный момент
использовать уже готовым.
Нужно обратить внимание на два 64-разрядных типа double и long. Поскольку многие
платформы поддерживают лишь 32-битную память, величины этих типов рассматриваются
как две переменные, и все описанные действия делаются независимо для двух половинок
таких значений. Конечно, если производитель виртуальной машины считает возможным,
он может обеспечить атомарность операций и над этими типами. Для volatile переменных
это является обязательным требованием.

PM MAIL   Вверх
w1nd
Дата 5.2.2008, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Цитата(Sardar @  5.2.2008,  14:33 Найти цитируемый пост)
Достаточно голословное утверждение.

Хорошо, вот вам простой сценарий: N потоков в цикле получают значение переменной, производят некоторые вычисления (какие - не важно), записывают результат в ту же переменную; ещё один отправляет каду-то это значение с некоторой периодичностью. Расскажите в двух словах, как компилятор сможет определить необходимость синхронизации доступа к этой переменной и как он сможет определить, какие конкретно участки кода требуется воткнуть в synchronized.

Цитата(Sardar @  5.2.2008,  14:33 Найти цитируемый пост)
Можешь провести тесты и убедится, что встроенные в язык решения всегда быстрей, чем аналогичное "в ручную" (извиняюсь, тоже голословное, результаты тестов потерял).

Вот тут мы никогда не договоримся. Я провожу эти тесты уже на протяжении пятнадцати лет smile Встроенные в язык средства могут дать возможность делать меньше грубых ошибок и быстрее получать рабочий код, но код этот НИКОГДА не будет лучше, чем сделанное руками. Это не обсуждается; если вы уверены в обратном, мне лишь остаётся вас поздравить с реализацией искуственного интеллекта и посетовать на вашу скрытность.

Цитата(Sardar @  5.2.2008,  14:33 Найти цитируемый пост)
В нормальных многопоточных средах нет volatile переменных, т.к. они нарушают основной принцип no side-effects. Попробуйте придумать хоть один сценарий, когда volatile переменная могла бы понадобится?

Это не принцип функционирования реальных систем ("no side-effects"), это идеал. Сферический конь в вакууме, если хотите. А что до примера - на ходу придумать не могу, не встречался, но более чем достаточно возможности такой ситуации в принципе. Ситуации, когда необходимо обойтись без блокировок, но нельзя не замечать динамики изменений некоторых данных.

Это сообщение отредактировал(а) w1nd - 5.2.2008, 17:41


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1100 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.