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

Поиск:

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


Бегун
****


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

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



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

Хороший пример когда volatile переменная вообще не нужна, по сути ведь теряем инфу. Это решается посредством пересылки сообщений, желательно с буффером, чем рендеву. Можно конечно по всякому задачу решить, но эффективным (быстро в run-time) решение с volatile переменной не будет, как я уже говорил, из-за не оправданных блокировок (вкйлучая железные) и отсутствию кеша. Поэтому такие сценарии исключаются в системах нацеленных на эффективную многопоточность/распределённость вычислений. Вывод: компилер не будет оптимизировать этот код (как беспоезно оптимизировать асм, кроме как простейшего pipe), он просто вам не даст писать такой (до жути не эффективный) код.

Цитата(w1nd @  5.2.2008,  16:41 Найти цитируемый пост)
Встроенные в язык средства могут дать возможность делать меньше грубых ошибок и быстрее получать рабочий код, но код этот НИКОГДА не будет лучше, чем сделанное руками.

Да, пустой спор. Вот тут бенчмарки. Компилер оптимизирует согласно вложенной технике, его сила в полном "восприятии" кода, человек же способен "видеть" только ограниченный кусок. Да хотя бы шедулер комманд в декларативном языке (к примеру Haskell) так выдаст инструкции, что бы каждое выражение вычислялось не не более одного раза, к тому же лениво (по требованию). Техника доказуемая формально, это всё что нужно от человека. А компилятор способен "разжевать" массу текста и построить самое эффективное (или приближенное) решение, формально доказуемое. Гений действительно может по иному посмотреть и организовать код, но таких единицы (и они привлекаются к разработке компиляторов/языков), остальные же в силу природной лени, либо пишут не эффективный код, либо пользуются решениями высокоуровнего языка. Каждый сценарий в высокоуровневом языке доказан, эффективность решения обоснованна/доказана, поэтому в целом код почти всегда быстрей, чем аналогичный "полностью в ручную", к примеру на C.

Вам стоит заинтересоваться теорией компиляторов, построением формальных языков и среды выполнения. Тогда исчезнут домыслы о искусственном интеллекте и не оправданное недооценивание теоретических основ (программирование - наука, а не только ремесло в форм дизайнере). Впрочем быть может вы правы, нейро-сетки из ИИ области в принципе могут помочь в нахождении общей "методологии"/практики среди группы программистов одного языка, всё таки мощный это инструмент обобщения.


Цитата(w1nd @  5.2.2008,  16:41 Найти цитируемый пост)
Это не принцип функционирования реальных систем ("no side-effects"), это идеал.

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

Цитата(w1nd @  5.2.2008,  16:41 Найти цитируемый пост)
Ситуации, когда необходимо обойтись без блокировок, но нельзя не замечать динамики изменений некоторых данных.

Можно "отречься" от ранее навязанной вам техники опроса состояния (polling) и просто ждать сообщений, поверь, это гораздо эффективней, особенно если сообщения идут в своих легковесных тредах и работает всё в сетке мелких процев.


Наофтопили  smile 


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


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


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

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



Цитата(Sardar @  5.2.2008,  18:57 Найти цитируемый пост)
Вывод: компилер не будет оптимизировать этот код (как беспоезно оптимизировать асм, кроме как простейшего pipe), он просто вам не даст писать такой (до жути не эффективный) код.

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

Цитата(Sardar @  5.2.2008,  18:57 Найти цитируемый пост)
Тогда исчезнут домыслы о искусственном интеллекте и не оправданное недооценивание теоретических основ (программирование - наука, а не только ремесло в форм дизайнере).

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

Цитата(Sardar @  5.2.2008,  18:57 Найти цитируемый пост)
Можно "отречься" от ранее навязанной вам техники опроса состояния (polling) и просто ждать сообщений, поверь, это гораздо эффективней, особенно если сообщения идут в своих легковесных тредах и работает всё в сетке мелких процев.

Слушатели - не лучшее решение, чем больше их будет, тем больше времени такая система будет тратить впустую. Я уже не говорю о ситуации, когда у вас попросту нет возможности расширять функционал некоторых подсистем.


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


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 7.8.2007
Где: Харків, Україна

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



Цитата(Sardar @ 5.2.2008,  14:33)
Попробуйте придумать хоть один сценарий, когда volatile переменная могла бы понадобится

могла бы понадобиться

Всё уже придумано до нас (© Неизвестный автор).

Код

class SomeSingleton {
    private volatile static SomeSingleton instance;
    private static Object lock = new Object();

    // lot of properties, including a, b, c, d, e, f, g, importantValue

    private SomeSingleton() {
        // large procedure of initialization
        importantValue = a + b + c + d - e * f / g;
    }

    public static SomeSingleton getInstance() {
        if (instance == null) {
            synchronized(lock) {
                if (instance == null) {
                    instance = new SomeSingleton();
                }
            }
        }

        return instance
    }

    public int getImportantValue() {
        return importantValue;
    }
}


Предположим, объект aa начинает доступ к этому одиночке, а следом за ним то же делает объект bb:
Код

aa = SomeSingleton.getInstance();
bb = SomeSingleton.getInstance();
cc = bb.getImportantValue;

Если instane не объявлять как volatile, то возможен такой сценарий:
Объект aa вызывает проверку (instance == null), одиночка убеждается, что инстанции ещё нет, создаёт в памяти соответствующий объект и начинает его инициализировать, а тем временем в основную память передаётся ссылка на этот объект.
Пока идёт инициализация, объект bb вызывает проверку, в ходе которой выясняется, что инстанция существует, и получает ссылку на объект instance. Потом объект сс пытается получить importantValue, но объект instance ещё не инициализирован до конца, и cc получает неправильное значение.
Если же instance будет volatile, то ссылка на instance не будет возвращена в основную память, пока не закончится инициализация этого объекта. Таким образом, вызов от объекта bb повлечёт проверку (instance == null) которая вернёт true, и управление будет далее передано в синхронизированный блок, bb дождётся своей очереди, узнает, что объект instance уже создан, и получит ссылку на него; при этом объект будет уже полностью инициализирован, и cc таки гарантированно получит правильное значение importantValue.
PM MAIL ICQ GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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