powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / wait/notify
20 сообщений из 45, страница 2 из 2
wait/notify
    #38622091
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Blazkowiczна сколько безопасно синхронизироваться на строковых константах и других публично доступных экземплярах?

А что тут небезопасного?

Blazkowicz- Почему для одного монитора целых 3 поля?
не вижу трёх полей
автор- Почему левая и правая нога - разные классы. У низ разная структура? Или разное поведение?
сделал ради очевидности. разные классы, разные потоки.
Blazkowicz- Почему одно поле final, а остальные - нет? На сколько это безопасно?
какие остальные?
Blazkowicz- Гарантирует ли Thread.sleep() ожидаемое поведение?
нет, но я думаю если его убрать, то ничего не поменяется. Это я так...проверить, что ничего не поменяется
...
Рейтинг: 0 / 0
wait/notify
    #38622094
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczquestionerто есть самый простой вариант создать какую-то третью сущность, доступ к которой будут иметь оба потока, засинхронизироваться по ней и менять ее состояние?

Код: java
1.
2.
private static final Object LOCK = new Object();
private boolean stepRight;



и это написать в классе LeftRightWaitNotifyExample?
...
Рейтинг: 0 / 0
wait/notify
    #38622105
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerА что тут небезопасного?

Кто угодно внутри этой же JVM может захватить публичный монитор и ваши ноги останутся ни с чем.

questionerне вижу трёх полей

Код: java
1.
2.
3.
4.
5.
6.
public class LeftRightWaitNotifyExample {
    final static String str = "1";//1
class LeftLegThread extends Thread {
    String monitor;//2
class RightLegThread extends Thread {
    String monitor;//3



questionerсделал ради очевидности. разные классы, разные потоки.

Даешь по классу на каждый объект!

questionerкакие остальные?

String monitor;

questionerнет, но я думаю если его убрать, то ничего не поменяется. Это я так...проверить, что ничего не поменяется
Тем не менее, никаких гарантий что один из этих потоков запустится первым - нет, пока нет явного состояния.
...
Рейтинг: 0 / 0
wait/notify
    #38622106
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerи это написать в классе LeftRightWaitNotifyExample?
в классе Leg.
...
Рейтинг: 0 / 0
wait/notify
    #38622112
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz Кто угодно внутри этой же JVM может захватить публичный монитор и ваши ноги останутся ни с чем.
вообще да


авторДаешь по классу на каждый объект!
ну так же всё таки более обший случай будет



questionerнет, но я думаю если его убрать, то ничего не поменяется. Это я так...проверить, что ничего не поменяется
Тем не менее, никаких гарантий что один из этих потоков запустится первым - нет, пока нет явного состояния.[/quot]

А если есть состояние, то как это повлияет?
...
Рейтинг: 0 / 0
wait/notify
    #38622118
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
questioner,



BlazkowiczДаешь по классу на каждый объект!

ну а если у нас нога с головой синхронизуется?
...
Рейтинг: 0 / 0
wait/notify
    #38622120
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerА если есть состояние, то как это повлияет?
Метод проверит состояние. Если надо ходить его ногой, то будет ходить. Если надо ходить другой ногой, то уснет.
Без явного состояние первой может пойти любая нога в зависимости от погоды (железа, ОС, версий и т.п.)
...
Рейтинг: 0 / 0
wait/notify
    #38623225
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Что скажете про такой код?

Код: 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.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
public class LeftRightWaitNotifyExample {
    private static SharedResource sharedResource = new SharedResource();

    public static void main(String[] args) throws InterruptedException {
        new RightLegThread(sharedResource).start();
        Thread.sleep(1000);
        new LeftLegThread(sharedResource).start();
    }
}

class LeftLegThread extends Thread {
    private SharedResource sharedResource;

    public LeftLegThread(SharedResource sharedResource2) {
        sharedResource = sharedResource2;
    }

    @Override
    public void run() {
        try {
            makeStep();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private void makeStep() throws InterruptedException {
        synchronized (sharedResource) {
            int i = 0;
            while (i++ < 10) {
                System.out.println("Left ");
                sharedResource.beforeLeftStep = false;
                sharedResource.notify();
                while (!sharedResource.beforeLeftStep) {
                    sharedResource.wait();
                }
            }
        }
    }
}

class RightLegThread extends Thread {
    private SharedResource sharedResource;

    public RightLegThread(SharedResource sharedResource2) {
        sharedResource = sharedResource2;
    }

    @Override
    public void run() {
        try {
            makeStep();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private void makeStep() throws InterruptedException {
        synchronized (sharedResource) {
            while (true) {
                if (!sharedResource.beforeLeftStep) {
                    System.out.println("Right ");
                    sharedResource.beforeLeftStep = true;
                }
                sharedResource.notify();
                while (sharedResource.beforeLeftStep) {
                    sharedResource.wait();
                }
            }
        }
    }
}

class SharedResource {
    boolean beforeLeftStep = true;
}


как филды спрятать я что-то не догадался, да.
...
Рейтинг: 0 / 0
wait/notify
    #38623229
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
P.S. предполагается, что надо с левой ноги начинать движение
...
Рейтинг: 0 / 0
wait/notify
    #38623244
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerЧто скажете про такой код?

Да, всё тоже самое. final - не знаем, volatile - не слышали, копипаста - рулит.
...
Рейтинг: 0 / 0
wait/notify
    #38623282
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

Код: 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.
public class LeftRight {

    public static void main(String[] args) {
        new Leg(true).start();
        new Leg(false).start();
    }

    static class Leg extends Thread {
        private static final Object LOCK = new Object();
        private static volatile boolean state;

        private final boolean right;

        public Leg(boolean right) {
            this.right = right;
        }

        @Override
        public void run() {
            try {
                while (!Thread.interrupted()) step();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        private void step() throws InterruptedException {
            synchronized (LOCK) {
                System.out.println(right ? "Right" : "Left");
                LOCK.notifyAll();
                while (state != right) {
                    LOCK.wait();
                }
                state = !state;
            }
        }
    }
}



Для красоты вместо boolean можно было бы и Enum завести.
...
Рейтинг: 0 / 0
wait/notify
    #38623308
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

volatile слышали, но разве тут необходим он?

ведь мы меняем булевую переменную только в synchronized секции. Мне казалось, что переменные по выходу из нее синхронизуются со здравым смыслом.
...
Рейтинг: 0 / 0
wait/notify
    #38623315
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerМне казалось...
Assumption is the mother of all fuck ups.
...
Рейтинг: 0 / 0
wait/notify
    #38623320
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: java
1.
2.
3.
 while (state != right) {
       LOCK.wait();
 }



а почему логика такая? спим только если мы левая нога?
...
Рейтинг: 0 / 0
wait/notify
    #38623326
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerа почему логика такая? спим только если мы левая нога?
right это переменная а не константа.
...
Рейтинг: 0 / 0
wait/notify
    #38623359
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Вы наверное в уме компилили, но
у меня такой вот вывод


авторRight
Left
Left
Right
Left
Right
Left
Right
Left
Right
Left
....
...
Рейтинг: 0 / 0
wait/notify
    #38623367
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Метод криво с наскока написал. Так лучше?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
        
            synchronized (LOCK) {
                while (state != right) {
                    LOCK.wait();
                }
                System.out.println(right ? "Right" : "Left");
                state = !state;
                LOCK.notifyAll();
            }
...
Рейтинг: 0 / 0
wait/notify
    #38623433
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

да, так лучше.


а можете помочь смоделировать ситуацию, когда один поток поменял переменную в synchronized блоке, покинул этот блок , а другой поток начал читать эту перменную и прочитал старое значение?
...
Рейтинг: 0 / 0
wait/notify
    #38624397
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
questioner,

вот так можно смоделировать:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
public class VolatileTest {

    static /*volatile*/ boolean done = false;

    public static void main(String[] args) throws Exception {
        Runnable waiter = new Runnable() {
            public void run() {
                while (!done) ;
                System.out.println("Exited loop");
            }
        };
        new Thread(waiter).start();
        Thread.sleep(100); // wait for JIT compilation
        synchronized ("123") {
            done = true;
        }     
        System.out.println("done is true " );
    }
}
...
Рейтинг: 0 / 0
wait/notify
    #38625931
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
questioner,

и вот ещё...."вместо тысячи слов"
http://www.jguru.com/faq/view.jsp?EID=98786
...
Рейтинг: 0 / 0
20 сообщений из 45, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / wait/notify
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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