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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> И опять синхронизация, и снова здравствуйте ) 
:(
    Опции темы
nucer
Дата 24.5.2009, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: -1
Всего: 0



В общем к примеру есть такая штука
Код

class Some
{
  private ArrayList list;
  public void read()
  {
     //чтение некоторых данных из list
  }
  
  public void write()
  {
    //запись некоторых данных в list
  }
}


собственно вопрос: как обеспечить синхронизацию методов read и write таким образом, чтобы read и write "блочили" друг друга, а также write и write блочили, а read и read не блочили??
Т.е. если сейчас пишется что то туда, то чтение или запись должны подождать, но чтобы несколько операций чтения (без записи) могли выполнялняться асинхронно...

Это сообщение отредактировал(а) nucer - 24.5.2009, 17:56
PM MAIL   Вверх
susanin
Дата 24.5.2009, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



есть класс ReentrantReadWriteLock....как раз отвечает за это....полагаю надо смотреть в его сторону..
PM MAIL   Вверх
jManiak
Дата 24.5.2009, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А почему не воспользоваться сигнальной переменной? 
Например:
Код

class Some
{
  private ArrayList list;
  private boolean isLocked = false;

  public void read()
  {
      while (isLocked) {
          wait(500);
      }
      isLocked = true;
      //чтение некоторых данных из list
      isLocked = false;
  }
  
  public void write()
  {
      while (isLocked) {
          wait(500);
      }
      isLocked = true;
      //запись некоторых данных в list
      isLocked = false;
  }
}


Это сообщение отредактировал(а) jManiak - 24.5.2009, 23:52
PM MAIL ICQ   Вверх
tux
Дата 25.5.2009, 05:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Цитата(jManiak @  24.5.2009,  23:51 Найти цитируемый пост)
А почему не воспользоваться сигнальной переменной? 

Потому что в многопоточной среде такой способ не работает - http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%...%BD%D0%BA%D0%B8.
PM MAIL Skype GTalk Jabber YIM   Вверх
Fieral
Дата 25.5.2009, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

class Some {
        private ArrayList list;

        private ReentrantLock L = new ReentrantLock(true);

        public void read()
      {
    L.lock
    try{

         //чтение некоторых данных из list
    }finally{
    L.unlock();}
      }

        public void write()
      {

    L.lock
    try{

        //запись некоторых данных в list
    }finally{
    L.unlock();}


      }
    }



?

Добавлено через 11 минут и 58 секунд
jManiak, особенно внимательно прочитайте "Случай с Therac-25" по ссылке данной tux.

Это сообщение отредактировал(а) Fieral - 25.5.2009, 13:03
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
SoulKeeper
Дата 25.5.2009, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

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



Надо использовать не ReentrantLock, а ReentrantReadWriteLock
PM MAIL   Вверх
jManiak
Дата 25.5.2009, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ну да, может быть большой ОЙ...
Пойду переделывать в одном месте.
PM MAIL ICQ   Вверх
nucer
Дата 25.5.2009, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: -1
Всего: 0



2susanin за ReentrantReadWriteLock спасибо, вроде то что надо! )
Правда код из примера немного смущает....
Код
class RWDictionary {
    private final Map<String, Data>  m = new TreeMap<String, Data>();
    private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
    private final Lock r = rwl.readLock();
    private final Lock w = rwl.writeLock();

    public Data get(String key) {
        r.lock(); try { return m.get(key); } finally { r.unlock(); }
    }
    public String[] allKeys() {
        r.lock(); try { return m.keySet().toArray(); } finally { r.unlock(); }
    }
    public Data put(String key, Data value) {
        w.lock(); try { return m.put(key, value); } finally { w.unlock(); }
    }
    public void clear() {
        w.lock(); try { m.clear(); } finally { w.unlock(); }
    }
 }

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

2Maniak 
Цитата
while (isLocked) {
          wait(500);
      }
 такой способ подходит разве что для проектирования п/о к дверце дачного с*рт*ра  smile  smile 

Это сообщение отредактировал(а) nucer - 25.5.2009, 20:20
PM MAIL   Вверх
susanin
Дата 25.5.2009, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(nucer @  25.5.2009,  20:18 Найти цитируемый пост)
Везде try и catch, разве это не херит производительность на корню? Вроде я даже читал где то, что try и catch следует стараться избегать и юзать предварительные проверки везде где возможно...

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

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

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


 




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


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

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