powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / В чем прикол дженерика ThreadLocal
10 сообщений из 10, страница 1 из 1
В чем прикол дженерика ThreadLocal
    #39492544
Фотография giigro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет!
Код: 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.
public class Main {
    public static void main(String[] args) throws InterruptedException {
        ThreadLocalTest custThread1 = new ThreadLocalTest();
        ThreadLocalTest custThread2 = new ThreadLocalTest();
        custThread1.start();
        Thread.currentThread().sleep(250);
        custThread2.start();
    }
}

class ThreadLocalClass{
    //private static ThreadLocal<Integer> ratio = new ThreadLocal<>();
    private static Integer ratio = new Integer(0);

    public static Integer getRatio() {
        //return ThreadLocalClass.ratio.get();
        return ThreadLocalClass.ratio;
    }

    public static void setRatio(Integer ratio) {
        //ThreadLocalClass.ratio.set(ratio);
        ThreadLocalClass.ratio = ratio;
    }
    public void printRatio() throws InterruptedException {
        Integer ratio = ThreadLocalClass.getRatio();
        Thread.currentThread().sleep(500);
        ThreadLocalClass.setRatio(ratio + 1);
        System.out.println("--Thread:" + Thread.currentThread().getId() + " | " + ThreadLocalClass.getRatio());
    }

}

class ThreadLocalTest extends Thread{

    ThreadLocalClass threadLocalClass = new ThreadLocalClass();
    @Override
    public void run() {
        ThreadLocalClass.setRatio(new Integer(0));
        try {
            for(int i = 0; i < 10; i++){
                threadLocalClass.printRatio();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}


Если вместо ThreadLocal использовать Integer (использовать закомменченные строки), то вывод будет тот же самый. Спрашивается, зачем тогда ThreadLocal?

ЗЫ В официальной доке можно проделать то же самое
...
Рейтинг: 0 / 0
В чем прикол дженерика ThreadLocal
    #39492562
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас 3 не связанных с друг другом вопроса.
1.
авторВ чем прикол дженерика ThreadLocal
Ни в чем. Точно такой же генерик как и любой другой.

2.
авторЕсли вместо ThreadLocal использовать Integer (использовать закомменченные строки), то вывод будет тот же самый
Особенности тестирования многопоточности. То что ваш код работает в какой-то единственной ситуации ещё не делает его потокобезопасным и не даёт никаких гарантий что он будет работать точно так же в других обстоятельствах. Единственный механизм доказательства потокабезопасности кода это JMM.

3.
авторСпрашивается, зачем тогда ThreadLocal
Чтобы хранить контекст связанный с потоком. Более точная формулировка есть в доке.
RTFMThe ThreadLocal class in Java enables you to create variables that can only be read and written by the same thread.
Нужна помощь с переводом?
...
Рейтинг: 0 / 0
В чем прикол дженерика ThreadLocal
    #39492573
Фотография giigro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть принципиальное отличие в том, что переменная класса ThreadLocal гарантированно не будет доступна для других потоков ни при каких обстоятельствах, и это поддерживается механикой JMM, а не кодом приложения. Все верно?
...
Рейтинг: 0 / 0
В чем прикол дженерика ThreadLocal
    #39492587
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
giigroТо есть принципиальное отличие в том, что переменная класса ThreadLocal гарантированно не будет доступна для других потоков
Нет. Вы ерунду написали. Переменная класса ThreadLocal доступна любому потоку. Речь не о переменных, а об объектах помещенных внутрь ThreadLocal.

giigroни при каких обстоятельствах
Снова ерунда. Речь только о работе с объектом типа ThreadLocal. В других обстоятельствах другие потоки могут получить ссылки другими способами.

giigro, и это поддерживается механикой JMM, а не кодом приложения. Все верно?
Это отдельная тама. JMM это не "механика".
...
Рейтинг: 0 / 0
В чем прикол дженерика ThreadLocal
    #39497436
rfq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczавторВ чем прикол дженерика ThreadLocal
Ни в чем. Точно такой же генерик как и любой другой.

Прикол есть. ThreadLocal моделирует хранение информации в потоке исполнения, при этом никак этот поток не затрагивая.
Объект типа ThreadLocal<T> tl содержит в себе мапу типа Map<Thread, T> m. Когда вы пишите tl.put(v), это превращается в m.put(currentThread(), v). tl.get() обращается к m.get(currentThread()). Таким образом, хотя объект tl виден всем потокам, каждый поток может записать и прочитать туда только значение, связанное с этим потоком. Возникает иллюзия, что мы динамически расширили память текущего потока и можем в ней хранить переменную T v. Да, память потока можно расширить и расширив класс Thread, как вы сделали в своем примере. Но ваше расширение доступно только методам из этого класса (setRatio, getRatio). ThreadLocal же, будучи статической переменной, доступна методам из других классов.
...
Рейтинг: 0 / 0
В чем прикол дженерика ThreadLocal
    #39497438
Фотография giigro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rfq,

Спасибо за исчерпывающий ответ
...
Рейтинг: 0 / 0
В чем прикол дженерика ThreadLocal
    #39497653
guest2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rfqПрикол есть. ThreadLocal моделирует хранение информации в потоке исполнения, при этом никак этот поток не затрагивая.
Объект типа ThreadLocal<T> tl содержит в себе мапу типа Map<Thread, T> m. Когда вы пишите tl.put(v), это превращается в m.put(currentThread(), v). tl.get() обращается к m.get(currentThread()).
Не совсем так. Это Thread имеет поле threadLocalMap, что-то вроде Map<ThreadLocal, Object>. Если бы ThreadLocal хранил ссылки на Thread-ы, для которых сохранены локальные данные, то это нельзя было бы использовать из-за утечек памяти.
...
Рейтинг: 0 / 0
В чем прикол дженерика ThreadLocal
    #39498058
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
giigrorfq,

Спасибо за исчерпывающий ответ
Не спеши благодарить. Ты еще попробуй юзкейс придумай. И чтоб польза была
...
Рейтинг: 0 / 0
В чем прикол дженерика ThreadLocal
    #39500568
rfq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest2Не совсем так. Это Thread имеет поле threadLocalMap, что-то вроде Map<ThreadLocal, Object>. Если бы ThreadLocal хранил ссылки на Thread-ы, для которых сохранены локальные данные, то это нельзя было бы использовать из-за утечек памяти.
Хм, действительно так. Я когда учил, зубрил: "объект типа ThreadLocal - это ключ в мапу, локальную в Thread'е". Но со временем это забылось.

А утечку памяти в варианте "ключ типа Thread" можно победить с помощью WeakReference.
...
Рейтинг: 0 / 0
В чем прикол дженерика ThreadLocal
    #39500570
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rfqguest2Не совсем так. Это Thread имеет поле threadLocalMap, что-то вроде Map<ThreadLocal, Object>. Если бы ThreadLocal хранил ссылки на Thread-ы, для которых сохранены локальные данные, то это нельзя было бы использовать из-за утечек памяти.
Хм, действительно так. Я когда учил, зубрил: "объект типа ThreadLocal - это ключ в мапу, локальную в Thread'е". Но со временем это забылось.

А утечку памяти в варианте "ключ типа Thread" можно победить с помощью WeakReference.
Ни фига себе победа...
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / В чем прикол дженерика ThreadLocal
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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