Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / В чем прикол дженерика ThreadLocal / 10 сообщений из 10, страница 1 из 1
20.07.2017, 17:13
    #39492544
giigro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем прикол дженерика ThreadLocal
Привет!
Код: 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
20.07.2017, 17:27
    #39492562
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем прикол дженерика ThreadLocal
У вас 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
20.07.2017, 17:37
    #39492573
giigro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем прикол дженерика ThreadLocal
То есть принципиальное отличие в том, что переменная класса ThreadLocal гарантированно не будет доступна для других потоков ни при каких обстоятельствах, и это поддерживается механикой JMM, а не кодом приложения. Все верно?
...
Рейтинг: 0 / 0
20.07.2017, 17:56
    #39492587
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем прикол дженерика ThreadLocal
giigroТо есть принципиальное отличие в том, что переменная класса ThreadLocal гарантированно не будет доступна для других потоков
Нет. Вы ерунду написали. Переменная класса ThreadLocal доступна любому потоку. Речь не о переменных, а об объектах помещенных внутрь ThreadLocal.

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

giigro, и это поддерживается механикой JMM, а не кодом приложения. Все верно?
Это отдельная тама. JMM это не "механика".
...
Рейтинг: 0 / 0
30.07.2017, 23:40
    #39497436
rfq
rfq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем прикол дженерика ThreadLocal
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
30.07.2017, 23:49
    #39497438
giigro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем прикол дженерика ThreadLocal
rfq,

Спасибо за исчерпывающий ответ
...
Рейтинг: 0 / 0
31.07.2017, 11:38
    #39497653
guest2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем прикол дженерика ThreadLocal
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
01.08.2017, 00:48
    #39498058
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем прикол дженерика ThreadLocal
giigrorfq,

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

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

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


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