Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668

Значение ключевого слова final в контексте многопоточных программ

13.04.2014, 17:55. Показов 3263. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Что можете поведать по теме сабжа?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.04.2014, 17:55
Ответы с готовыми решениями:

Создание многопоточных программ
https://sites.google.com/site/bindingandserviceparallel/home/files В документе рассматривается принцип организации многопоточных...

Разработка многопоточных программ в Windows
Разработать программу вычисления максимального значения в двумерном массиве. Требования: 1.Количество потоков задаётся...

Вывести все слова текста, которые нельзя составить из «ключевого» слова
Помогите пожалуйста,в edit1 вводиться текст нужно вывести все слова текста, которые нельзя составить из «ключевого» слова. Ключевое слово...

32
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
26.04.2014, 14:03  [ТС]
Студворк — интернет-сервис помощи студентам
bigwhitefish, по-моему ситуация аналогичная. в случае интерфейса, что пиши, что не пиши public - всё равно будет public.

В случае с final ссылку нельзя изменять, соответственно volatile ничего не добавит.
0
53 / 53 / 14
Регистрация: 26.02.2014
Сообщений: 150
26.04.2014, 14:42
Ну и?
0
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
26.04.2014, 22:51  [ТС]
bigwhitefish, .... не такая уж это и тупость....просто Вы меня прям так сразу оценили...
0
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
28.04.2014, 12:08  [ТС]
turbanoff,
ну в общем я так понял суть в следующем:
у нас есть некоторый shared(между потоками) ресурс.
Мы точно знаем, что кусок кода А выполниться раньше куска кода B. Эти куски кода выполняются в разных потоках. Безопасной публикацией называется то,что если в куске кода А мы изменили shared ресурс, то кусок кода B это гарантированно увидит.

теперь по статье:

Элементарных способов безопасной публикации несколько:
инициализация статическим инициализатором (JLS 12.4)
запись в поле, корректно защищённое локом (JLS 17.4.5)
запись в volatile-поле (JLS 17.4.5), и как следствие, запись в атомики
запись в final-поле (JLS 17.5)

последние два пункта ясны.

а вот по первым прошу пояснить:
инициализация статическим инициализатором (JLS 12.4)
запись в поле, корректно защищённое локом (JLS 17.4.5)
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
28.04.2014, 12:47
Цитата Сообщение от gredwhite Посмотреть сообщение
инициализация статическим инициализатором (JLS 12.4)
Java
1
2
3
4
5
6
7
public class Main {
    public static Main main;
 
    static {
        main = new Main();
    }
}
Цитата Сообщение от gredwhite Посмотреть сообщение
запись в поле, корректно защищённое локом (JLS 17.4.5)
Java
1
2
3
4
5
6
7
8
9
    public static Main main;
 
    static synchronized void setMain(Main main) {
        Main.main = main;
    }
 
    public static synchronized Main getMain() {
        return main;
    }
1
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
28.04.2014, 13:05  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
Код Java(TM) 2 Platform Standard Edition 5.0

public class Main {
* * public static Main main;
static {
* * * * main = new Main();
* * }
}
любой поток увидит одно и то же Main.main гарантированно. в этом суть?


я наверное Вас не до конца понимаю.


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
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
28.04.2014, 13:22
Цитата Сообщение от gredwhite Посмотреть сообщение
разве этот пример не соответствует вашему пояснению "запись в поле, корректно защищённое локом"
Чтение поля тоже должно быть защищено локом.

Добавлено через 29 секунд
Цитата Сообщение от gredwhite Посмотреть сообщение
любой поток увидит одно и то же Main.main гарантированно. в этом суть?
И все его поля.
0
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
28.04.2014, 15:06  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
Чтение поля тоже должно быть защищено локом.
обязательно по одному монитору?(судя по эксперименту - да)

Цитата Сообщение от turbanoff Посмотреть сообщение
И все его поля.
хм. а можете, пожалуйста, примером пояснить. Ведь Если мы пишем volatile, то он действует только на помеченную ссылку. на филды объекта на который указывает volatile ссылка это не распространяется.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
28.04.2014, 16:02
gredwhite, Запись в volatile поле запрещает компилятору/JIT/процессору делать реордеринг инструкций. То есть, если один из потоков, сначала делает какие-либо записи после чего пишет в volatile. И другой поток прочитал именно это значение из volatile поля, то этот другой поток также обязательно увидит и все те другие (не-volatile) записи.
Даже есть название у такой техники (когда сначала идет запись не-volatile полей и в конце одна volatile запись) - http://stackoverflow.com/quest... -visiblity
1
53 / 53 / 14
Регистрация: 26.02.2014
Сообщений: 150
28.04.2014, 17:03
turbanoff, не в коня корм. пациенту надо сначала разобраться обеспечением целостности данных с помощью старого доброго synchronized. Который, кстати, не так уж прост, и для 99% случаев оптимален. Поэтому лучше сконцентрироваться на нем, а не скакать по сложным вещам, иначе у пациента просто образуется каша в голове.

Добавлено через 3 минуты
И, кстати, реордеринг происходит не только в компиляторе, но и в процессоре.
0
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
28.04.2014, 17:52  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
Запись в volatile поле запрещает компилятору/JIT/процессору делать реордеринг инструкций. То есть, если один из потоков, сначала делает какие-либо записи после чего пишет в volatile. И другой поток прочитал именно это значение из volatile поля, то этот другой поток также обязательно увидит и все те другие (не-volatile) записи.
Даже есть название у такой техники (когда сначала идет запись не-volatile полей и в конце одна volatile запись) - http://stackoverflow.com/quest... -visiblity

спасибо, познавательно. Интересная техника.



Цитата Сообщение от turbanoff Посмотреть сообщение

Java
1
2
3
4
5
6
public class Main {
* * public static Main main;
static {
* * * * main = new Main();
* * }
}


Я всё ещё про это узнаю и мне кажется Вы мне не совсем на это ответили.
0
127 / 131 / 11
Регистрация: 25.12.2011
Сообщений: 443
29.04.2014, 14:42
Про final.
0
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
29.04.2014, 15:22  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
bigwhitefish, Это то всё понятно. Можете объяснить зачем там локальная переменная участвует?
тут говорят, что таки не факт, что если мы первый раз увидел, то второй раз тож увидим. (про NPE)
http://www.youtube.com/watch?v... t=1h30m44s

Добавлено через 1 минуту
хотя у нас же synchronized....
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.04.2014, 15:22

Вывести слова, из которых нельзя составить ключевого слова, ключевое слово вводится отдельно
вывести слова из которых нельзя составить ключевого слова, ключевое слово вводится отдельно.. помогите, все что получается это вот и то не...

Слова текста, которые нельзя составить из «ключевого» слова
Дан произвольный текст на русском языке(который вводится в edit1) . Определить и вывести: Все слова текста, которые нельзя составить из...

Записать в файл все ключевые слова, встречающиеся в программе, указав количество появлений ключевого слова
Дана программа, написанная на языке Pascal. Записать в выходной файл построчно все ключевые слова, встречающиеся в этой программе, указав...

В чем разница между “static final” VS “final”?
"static final" и "final". Оба значения константы и изменению не подлежат. В чем же разница?

Поиск ключевого слова
Доброго времени суток. Недавно воспользовался данным форумом, очень помогло. Возник следующий вопрос ... Я нашел длину ключевого слова (4...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru