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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> синхронизация потоков 
:(
    Опции темы
Pawl
Дата 7.7.2012, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(jk1 @  7.7.2012,  00:11 Найти цитируемый пост)
Нет, я хочу сказать, что snA и snB там не изменяются. Вообще.

Сорри, действительно был не внимателен!


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
lavan
Дата 7.7.2012, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем большое спасибо за участие!
PM MAIL   Вверх
Pawl
Дата 7.7.2012, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Pawl @  7.7.2012,  00:18 Найти цитируемый пост)
Цитата(jk1 @  7.7.2012,  00:11 )Нет, я хочу сказать, что snA и snB там не изменяются. Вообще.Сорри, действительно был не внимателен!

и все-таки, видимо, на разных. Потому что, если использовать static-поля, дедлока не получается:
Код

class A extends Thread{
    public static final Boolean snA = true, snB = true;
    public static volatile Boolean flagA = true, flagB = true;

    @Override
    public void run(){
        try {
            for(int i=0;i<10;i++) {
                synchronized(snA) {
                    if(!flagB){
                        System.out.print("A wait - "+i+" ");
                        snA.wait();
                    }
                    System.out.print("[A] ");
                }//sn
                synchronized(snB) {
                    System.out.print("A osv B ");
                    flagA = new Boolean(false);
                    flagB = new Boolean(false);
                    snB.notify();
                }
            }
        } catch(InterruptedException ie){
            System.out.println(ie.getMessage());
        }
    }
}
class B extends Thread{

    @Override
    public void run() {
       try {
          for(int i=0;i<10;i++) {
            synchronized(A.snB) {
                if(A.flagA) {
                    System.out.print("B wait - "+i+" ");
                    A.snB.wait();
                }
                System.out.print("[B] ");
           }
           synchronized(A.snA) {
               System.out.print("B osv A");
               A.flagA = new Boolean(true);
               A.flagB = new Boolean(true);
               A.snA.notify();
          }//sn
        }
      } catch(InterruptedException ie){
          System.out.println(ie.getMessage());
      }
    }
}

public class Main {
    public static void main(String[] args) {
        try {
            A ta = new A();
            A tb = new A();
            ta.start();
            tb.start();
            ta.join();
            tb.join();
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }
}


Это сообщение отредактировал(а) Pawl - 7.7.2012, 10:13


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
jk1
Дата 7.7.2012, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

и все-таки, видимо, на разных. Потому что, если использовать static-поля, дедлока не получается:


Получается, запустите несколько раз свой пример и посмотрите. У меня он нормально работает примерно 1 раз из 10, то есть это полный эквивалент исходного примера.

Да и вообще, описанная ситуация - не дедлок. В дедлоке потоки находятся в ожидании ресурсов, захваченных кем-то еще. В терминах Java потоки находятся при этом в entry set монитора:

user posted image

В нашем же случае потоки сидят в wait set, причем по причине собственной глупости. Никаких ресурсов они не ожидают. С тем же успехом дедлоком можно называть ситуацию, когда одиночный поток уходит в wait, а разбудить его некому.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Pawl
Дата 7.7.2012, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(jk1 @  7.7.2012,  11:22 Найти цитируемый пост)
Получается, запустите несколько раз свой пример и посмотрите. У меня он нормально работает примерно 1 раз из 10

Прошу прощения, я не то выложил! В классе Main надо было написать
Код

public class Main {
    public static void main(String[] args) {
        try {
            A ta = new A();
            B tb = new B();
            ta.start();
            tb.start();
            ta.join();
            tb.join();
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }
}

запускал 50 раз - отрабатывало нормально.

Это сообщение отредактировал(а) Pawl - 7.7.2012, 11:45


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

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

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


 




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


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

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