Когда и как я должен использовать переменную ThreadLocal? - PullRequest
831 голосов
/ 03 мая 2009

Когда я должен использовать переменную ThreadLocal?

Как это используется?

Ответы [ 24 ]

0 голосов
/ 07 октября 2018

Существует 3 сценария использования помощника класса , такого как SimpleDateFormat в многопоточном коде, который лучше всего использовать ThreadLocal

Сценарии

1- Использование общего объекта с помощью механизма блокировки или синхронизации , который делает приложение медленным

2- Использование в качестве локального объекта внутри метода

В этом сценарии, если у нас есть 4 потока , каждый из которых вызывает метод 1000 раз, тогда мы имеем
4000 SimpleDateFormat объект создан и ожидает GC, чтобы стереть их

3- Использование ThreadLocal

если у нас есть 4 потока и мы дали каждому потоку один экземпляр SimpleDateFormat
таким образом, у нас есть 4 потока , 4 объекта из SimpleDateFormat.

Нет необходимости в механизме блокировки, создании и уничтожении объектов. (Хорошая временная сложность и пространственная сложность)

0 голосов
/ 12 декабря 2017

Threadlocal обеспечивает очень простой способ достижения повторного использования объектов с нулевой стоимостью.

У меня была ситуация, когда несколько потоков создавали образ изменяемого кэша при каждом уведомлении об обновлении.

Я использовал Threadlocal в каждом потоке, а затем каждому потоку просто нужно было сбросить старое изображение и затем обновлять его из кэша при каждом уведомлении об обновлении.

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

0 голосов
/ 30 мая 2017

ThreadLocal - это специально предоставленная функциональность JVM для предоставления изолированного пространства хранения только для потоков. подобно значению переменной области видимости, привязанной только к данному экземпляру класса. каждый объект имеет свои единственные значения, и они не могут видеть значения друг друга. как и концепция переменных ThreadLocal, они являются локальными для потока в том смысле, что экземпляры объектов, которые другие потоки, кроме той, которая его создала, не могут ее видеть. Смотрите здесь

import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.IntStream;


public class ThreadId {
private static final AtomicInteger nextId = new AtomicInteger(1000);

// Thread local variable containing each thread's ID
private static final ThreadLocal<Integer> threadId = ThreadLocal.withInitial(() -> nextId.getAndIncrement());


// Returns the current thread's unique ID, assigning it if necessary
public static int get() {
    return threadId.get();
}

public static void main(String[] args) {

    new Thread(() -> IntStream.range(1, 3).forEach(i -> {
        System.out.println(Thread.currentThread().getName() + " >> " + new ThreadId().get());
    })).start();

    new Thread(() -> IntStream.range(1, 3).forEach(i -> {
        System.out.println(Thread.currentThread().getName() + " >> " + new ThreadId().get());
    })).start();

    new Thread(() -> IntStream.range(1, 3).forEach(i -> {
        System.out.println(Thread.currentThread().getName() + " >> " + new ThreadId().get());
    })).start();

}
}
0 голосов
/ 15 июня 2015

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

...