powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Если в данном коде ошибки с точки зрения потокобезопасности
25 сообщений из 26, страница 1 из 2
Если в данном коде ошибки с точки зрения потокобезопасности
    #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
Если в данном коде ошибки с точки зрения потокобезопасности
    #38888601
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mr_virtus,

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

PS что за извращенцы придумывают такую хрень :)
...
Рейтинг: 0 / 0
Если в данном коде ошибки с точки зрения потокобезопасности
    #38888626
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы хотели спросить есть ли в данных ошибках немного кода? :) Подсказка номер 1 - потоки шарят между собой не только valueно и steps
...
Рейтинг: 0 / 0
Если в данном коде ошибки с точки зрения потокобезопасности
    #38888627
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А у кого мячик сначала?
...
Рейтинг: 0 / 0
Если в данном коде ошибки с точки зрения потокобезопасности
    #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
Если в данном коде ошибки с точки зрения потокобезопасности
    #38888656
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мой вопрос повис в воздухе.
...
Рейтинг: 0 / 0
Если в данном коде ошибки с точки зрения потокобезопасности
    #38888657
mr_virtus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник,

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

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

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

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

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

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

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

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

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

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

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

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

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


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