Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Если в данном коде ошибки с точки зрения потокобезопасности / 25 сообщений из 26, страница 1 из 2
25.02.2015, 15:13
    #38888557
mr_virtus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в данном коде ошибки с точки зрения потокобезопасности
Привет.

Программа выводит пинг понг пинг понг... и использует для этого два потока.(Эмуляция настольного тенниса)

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
class PingPong implements Runnable {

    private static volatile String value = "ping";
    private int steps = 10;
    static Object obj = new Object();

    public void run(){
        try {
            while (steps != 0){
                synchronized (obj){
                    System.out.println(value);
                    changeValue();
                    obj.notify();
                    obj.wait();
                }
                steps--;
            }
        }
        catch (InterruptedException e){
            e.printStackTrace();
        }
    }

    public void changeValue(){
        if (value.equals("ping")) {
            value = "pong";
        }else
            value = "ping";
    }
}

public class Testing {
    public static void main(String[] args) {
        PingPong pingPong1 = new PingPong();
        PingPong pingPong2 = new PingPong();
        Thread thread1 = new Thread(pingPong1);
        Thread thread2 = new Thread(pingPong2);
        thread1.start();
        thread2.start();
    }
}



Подскажите, пожалуйста, если здесь ошибки с точки зрения потоко безопасности?
...
Рейтинг: 0 / 0
25.02.2015, 15:41
    #38888601
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в данном коде ошибки с точки зрения потокобезопасности
mr_virtus,

оно зависать должно, т.к. при steps==0 один тред просто завершается, а второй так и висит на ожидании notify.

PS что за извращенцы придумывают такую хрень :)
...
Рейтинг: 0 / 0
25.02.2015, 15:59
    #38888626
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в данном коде ошибки с точки зрения потокобезопасности
Вы хотели спросить есть ли в данных ошибках немного кода? :) Подсказка номер 1 - потоки шарят между собой не только valueно и steps
...
Рейтинг: 0 / 0
25.02.2015, 15:59
    #38888627
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в данном коде ошибки с точки зрения потокобезопасности
А у кого мячик сначала?
...
Рейтинг: 0 / 0
25.02.2015, 16:13
    #38888652
mr_virtus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в данном коде ошибки с точки зрения потокобезопасности
DDiver,

спасибо.

сделал так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
while (steps != 0){
                synchronized (obj){
                    System.out.println(value);
                    changeValue();
                    obj.notify();
                    if (steps != 1){
                        obj.wait();
                    }

                }
                steps--;
            }
...
Рейтинг: 0 / 0
25.02.2015, 16:16
    #38888656
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в данном коде ошибки с точки зрения потокобезопасности
Мой вопрос повис в воздухе.
...
Рейтинг: 0 / 0
25.02.2015, 16:16
    #38888657
mr_virtus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в данном коде ошибки с точки зрения потокобезопасности
забыл ник,

уважаемый, steps - это переменная объекта.

Можете, поконкретней, пожалуйста, если вы видите ошибку и хотите помочь. Или поправьте меня если я ошибаюсь.
...
Рейтинг: 0 / 0
25.02.2015, 16:16
    #38888659
mr_virtus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в данном коде ошибки с точки зрения потокобезопасности
mayton,
так у треда 1
...
Рейтинг: 0 / 0
25.02.2015, 16:18
    #38888661
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в данном коде ошибки с точки зрения потокобезопасности
mr_virtus,

"если" и "есть ли" это не синонимы.
...
Рейтинг: 0 / 0
25.02.2015, 16:21
    #38888666
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в данном коде ошибки с точки зрения потокобезопасности
mr_virtusmayton,
так у треда 1
Да ладно. Где это описано?
...
Рейтинг: 0 / 0
25.02.2015, 16:22
    #38888667
mr_virtus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в данном коде ошибки с точки зрения потокобезопасности
mayton,

стартует первым.
...
Рейтинг: 0 / 0
25.02.2015, 16:23
    #38888669
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в данном коде ошибки с точки зрения потокобезопасности
mr_virtus,

Доступ к steps не синхронизирован.
obj не final
wait не обезопасен от ложных либо неожиданных пробуждений.
http://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html
...
Рейтинг: 0 / 0
25.02.2015, 16:23
    #38888670
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в данном коде ошибки с точки зрения потокобезопасности
mr_virtusmayton,

стартует первым.

Не гарантировано.
...
Рейтинг: 0 / 0
25.02.2015, 16:26
    #38888673
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в данном коде ошибки с точки зрения потокобезопасности
Ого... звучит убедительно. Стартует...
...
Рейтинг: 0 / 0
25.02.2015, 16:27
    #38888675
mr_virtus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в данном коде ошибки с точки зрения потокобезопасности
Blazkowicz, mayton

все понял, спасибо большое :)
...
Рейтинг: 0 / 0
25.02.2015, 16:28
    #38888680
0FD
0FD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в данном коде ошибки с точки зрения потокобезопасности
mr_virtus,

volatile не нужно, т.к. есть synchronized (obj)

steps не шарится между потоками, поэтому и не синхронизирован.
...
Рейтинг: 0 / 0
25.02.2015, 16:29
    #38888684
mr_virtus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в данном коде ошибки с точки зрения потокобезопасности
0FD,

ну вот я тоже про степс так не понял, зачем её синхронизировать в данном листинге
...
Рейтинг: 0 / 0
25.02.2015, 16:30
    #38888686
mr_virtus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в данном коде ошибки с точки зрения потокобезопасности
Blazkowicz,

а можете, пожалуйста, пояснить, зачем Object final делать?
...
Рейтинг: 0 / 0
25.02.2015, 16:31
    #38888687
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в данном коде ошибки с точки зрения потокобезопасности
Интересно создать 4-х игроков и заставить их инстнциироваться с одним мячиком.
...
Рейтинг: 0 / 0
25.02.2015, 16:33
    #38888692
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в данном коде ошибки с точки зрения потокобезопасности
Blazkowiczmr_virtus,
Доступ к steps не синхронизирован.
obj не final
steps у ТС локальная переменная, у каждого своя, или я ошибаюсь?
а зачем делать obj final? только защититься от случайного изменения объекта синхронизации, или есть необходимость?
...
Рейтинг: 0 / 0
25.02.2015, 16:35
    #38888698
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в данном коде ошибки с точки зрения потокобезопасности
0FDsteps не шарится между потоками, поэтому и не синхронизирован.
Гениальный coding convention который рекомендует прятать instance поле между static полями.
...
Рейтинг: 0 / 0
25.02.2015, 16:36
    #38888700
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в данном коде ошибки с точки зрения потокобезопасности
DDiversteps у ТС локальная переменная, у каждого своя, или я ошибаюсь?

Поле экземпляра и локальная переменная не одно и тоже. Кодер смело впихнул поле между статиков, поэтому при беглом чтении не очевидно что это не static.
...
Рейтинг: 0 / 0
25.02.2015, 16:39
    #38888706
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в данном коде ошибки с точки зрения потокобезопасности
mr_virtus,
в принципе, не вдаваясь в код, ситуация, когда wait идет после notify, чревата дедлоками: остануться потоки в ждущем состоянии, которых некому будет оповестить. Да и бессмысленно. Обычно наоборот:
- ждут какого-то условия в цикле
- выполняют работу
- оповещают
...
Рейтинг: 0 / 0
25.02.2015, 16:48
    #38888717
mr_virtus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в данном коде ошибки с точки зрения потокобезопасности
ivanra, спасибо.
...
Рейтинг: 0 / 0
25.02.2015, 17:42
    #38888787
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в данном коде ошибки с точки зрения потокобезопасности
DDiverтолько защититься от случайного изменения объекта синхронизации, или есть необходимость?
Необходимости помогать тому, кто будет разбираться в коде (в т.ч. оптимизатору) нет.
Ну и кроме того - да действительно, как это красиво пишут на англицком языке - Updating final static fields will be slightly more complicated.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Если в данном коде ошибки с точки зрения потокобезопасности / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]