2010-10-11 2 views
0

Все,Подход к поточной безопасной программе

Каким должен быть подход к написанию программы, защищенной потоком. Учитывая постановку проблемы, моя перспектива:

1> Начало написания кода для однопоточной среды.
2> Подчеркивание поля, которые нужны были бы неделимость и заменить с возможными параллельными классами
3> Подчеркивание критической секции и вложить их в синхронном
-> Выполнение теста для тупиков

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

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

ответ

3

Написание правильного многопоточного кода сложно, и нет волшебной формулы или набора шагов, которые доставят вас туда. Но есть некоторые рекомендации, которыми вы можете следовать.

Лично я бы не начал писать код для одной потоковой среды, а затем преобразовал ее в многопоточную. Хороший многопоточный код разработан с многопоточным разумом с самого начала. Атомарность полей - это всего лишь один элемент параллельного кода.

Вы должны решить, какие области кода должны быть многопоточными (в многопоточном приложении, как правило, не все должно быть потокобезопасным). Затем вам нужно спроектировать, как эти разделы будут потокобезопасными. Способы создания одной области потокобезопасности кода могут быть разными, чем другие области. Например, важно понимать, будет ли большой объем чтения или записи важным и может повлиять на типы блокировок, которые вы используете для защиты данных.

Неизменимость также является ключевым элементом потокобезопасного кода. Когда элементы неизменяемы (т. Е. Не могут быть изменены), вам не нужно беспокоиться о том, что несколько потоков изменяют их, поскольку они не могут быть изменены. Это может значительно упростить проблемы безопасности потоков и позволить вам сосредоточиться на том, где у вас будет несколько считывателей и писателей.

Понимание деталей параллелизма в Java (и деталей модели памяти Java) очень важно. Если вы еще не знакомы с этими понятиями, я рекомендую прочитать Java Concurrency In Practice http://www.javaconcurrencyinpractice.com/.

+0

+1 для неизменности. Минимизация записываемого состояния уменьшает многие проблемы параллелизма. – ide

0

Любых переменные (память) доступно несколько потоков потенциально в то же самое время, должно быть защищено с помощью механизма синхронизации.

1

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

synchronized (this) { 
    // update 
    } 

И помните, иногда StuFF тормоза, и если это произойдет, то дон Не пытайтесь продлить выполнение программы, используя все возможные способы борьбы с ней - вместо этого «не быстро».

1

Как вы спрашивали о «потоковой безопасности», а не о параллельной работе, ваш подход по сути звучит. Тем не менее, поточно-безопасная программа, использующая синхронизацию, вероятно, мало масштабируется в среде с несколькими процессорами с любым уровнем конкуренции в вашей структуре/программе.

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

Это может быть сложно структурировать, если ваше новое состояние совсем другое (например, требуется несколько обновлений для нескольких полей), но я видел, что он очень успешно разрешает одновременные проблемы с производительностью с синхронизированным доступом.

1

Купите и прочитайте «Java Concurrency на практике» Брайана Гёца.

Смежные вопросы