Re: Атомарность в избранное  новое всё   подписка   модер. 
От: seredahttp://igorsereda.moikrug.ru
Дата: 14.10.04 07:22
Оценка: +1
Здравствуйте, vladserge, Вы писали:

V>Привет всем!


V>Неоднократно, в своей работе сталкиваюсь с необходимостю языковой конструкции которая позволяла бы указать что вот данный участок кода нужно выполнять целостно,атомарно категорически недопуская переключения потока (thread switching) в нем (внутри него).



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

Я полагаю, Вы хотите достигнуть атомарности операции. Переключение потоков здесь ни при чем. Просто надо обеспечить условия для того, чтобы другой поток не "увидел" результаты вашей операции, пока она до конца не выполнилась.

В Java для этого используются мониторы и ключевое слово synchronized.

Переписывая Ваш пример:

boolean usingResource = false;
Object lock = new Object();

static boolean useResource() {
  synchronized (lock) {
    if (usingResource)
      return false;
    usingResource = true;
  }
  ....
  ....

  synchronized (lock) {
    usingResource = false;
  }
}



При заходе в блок synchronized монитор, ассоциированный с объектом lock, включается, и другие потоки не смогут войти в блок с таким же монитором, пока тот не освободится.

По моему, очень удобная и высокоуровневая конструкция, учитывая дополнительные возможности Java с ключевым словом synchronized.