powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / oracle tutorials многопоточность
3 сообщений из 3, страница 1 из 1
oracle tutorials многопоточность
    #39074686
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил восполнить пробел и немного подтянуть скилл многопоточности в джаве. Вот например:
Код: 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.
public class BadThreads {

    static String message;

    private static class CorrectorThread
        extends Thread {

        public void run() {
            try {
                sleep(1000); 
            } catch (InterruptedException e) {}
            // Key statement 1:
            message = "Mares do eat oats."; 
        }
    }

    public static void main(String args[])
        throws InterruptedException {

        (new CorrectorThread()).start();
        message = "Mares do not eat oats.";
        Thread.sleep(2000);
        // Key statement 2:
        System.out.println(message);
    }
}



Это из туториалов оракла, и вопрос: всегда ли будет выводиться Mares do eat oats и если нет, то можно ли так сделать.
И вот ответ:
авторThere are two ways you can guarantee that all changes to message will be visible to the main thread:

1.In the main thread, retain a reference to the CorrectorThread instance. Then invoke join on that instance before referring to message
2.Encapsulate message in an object with synchronized methods. Never reference message except through those methods.

Both of these techniques establish the necessary happens-before relationship, making changes to message visible.

3.A third technique is to simply declare message as volatile. This guarantees that any write to message (as in "Key statement 1") will have a happens-before relationship with any subsequent reads of message (as in "Key statement 2"). But it does not guarantee that "Key statement 1" will literally happen before "Key statement 2" . They will probably happen in sequence, but because of scheduling uncertainities and the unknown granularity of sleep, this is not guaranteed.
А что, разве второй вариант с синхронизацией как-то поможет сделать, что "Key statement 1" will literally happen before "Key statement 2"? Мне всегда казалось, что вариант здесь только один - с join (первый), второй и третий - одинаковые в данном случае. Тоесть здесь как-бы дата рэйс и мемори инконсистенси, второе решается всеми тремя вариантами, а первое - только первым.
...
Рейтинг: 0 / 0
oracle tutorials многопоточность
    #39074830
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вообще соглашусь с вами, вы ничего не вырезали из середины текста и какая точная формулировка вопроса?
...
Рейтинг: 0 / 0
oracle tutorials многопоточность
    #39074858
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обсуждение этого вопроса более наглядно если рисовать временную диаграмму работы потоков.
Тоесть где поток создан. Где работает. Где завершил работу.

Там же и рассмотреть разные кейсы ситуаций. Что ДО что ПОСЛЕ.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / oracle tutorials многопоточность
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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