Maison  >  Article  >  Java  >  Qu’est-ce que ThreadLocal ? Analyse principale de ThreadLocal

Qu’est-ce que ThreadLocal ? Analyse principale de ThreadLocal

不言
不言avant
2018-10-11 16:37:3810797parcourir

Cet article vous explique qu'est-ce que ThreadLocal ? L'analyse principale de ThreadLocal a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'elle vous sera utile.

1. Qu'est-ce que ThreadLocal ?

ThreadLocal fournit des variables locales de thread. Ces variables diffèrent des variables ordinaires dans la mesure où chaque thread qui accède à une telle variable (via sa méthode get ou set) possède sa propre copie initialisée indépendamment de la variable.

Les instances ThreadLocal sont généralement des champs statiques privés de classes qui souhaitent associer un état à un thread (par exemple, un ID utilisateur ou un ID de transaction, etc.).

(Voix off : Ce passage exprime trois significations

1. ThreadLocal est un type de variable, que nous appelons "variables locales de thread".

2. Chaque thread sera créer une copie de la variable lors de l'accès. Cette copie de variable est privée au thread

3. Les variables de type ThreadLocal sont généralement modifiées avec du statique privé)

Par exemple, dans l'exemple. en dessous, cette classe génère un identifiant unique pour chaque thread. L'ID d'un thread est spécifié lors du premier appel de la méthode ThreadId.get().

package com.cjs.example;
import java.util.concurrent.atomic.AtomicInteger;
public class ThreadId {
    private static final AtomicInteger nextId = new AtomicInteger(0);
    private static final ThreadLocal<Integer> threadId = new ThreadLocal<Integer>() {
        @Override
        protected Integer initialValue() {
            return nextId.getAndIncrement();
        }
    };
    public static int get() {
        return threadId.get();
    }
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getId());
                }
            }).start();
        }
    }
}

2. Principales opérations de ThreadLocal

/**
 * 返回当前线程对ThreadLocal变量的“初始值”
 * 这个方法将在线程第一次访问变量(通过调用get方法)时被调用,如果之前已经调用过了就不会再调了
 *
 * @return the initial value for this thread-local
 */
protected T initialValue() {
    return null;
}

/**
 * 设置当前线程的ThreadLocal变量的副本为指定的值
 *
 * @param value the value to be stored in the current thread&#39;s copy of this thread-local.
 */
public void set(T value) {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null)
        map.set(this, value);
    else
        createMap(t, value);
}
/**
 * 返回当前线程的ThreadLocal变量副本的值
 *
 * @return the current thread&#39;s value of this thread-local
 */
public T get() {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null) {
        ThreadLocalMap.Entry e = map.getEntry(this);
        if (e != null) {
            @SuppressWarnings("unchecked")
            T result = (T)e.value;
            return result;
        }
    }
    return setInitialValue();
}

/**
 * 删除当前线程的ThreadLocal变量副本的值
 */
public void remove() {
    ThreadLocalMap m = getMap(Thread.currentThread());
    if (m != null)
        m.remove(this);
}

3. Lire le code source

3.1. Définir la méthode

Comme vous pouvez le voir, la couche inférieure de ThreadLocalMap est un tableau, et le type d'élément dans le tableau est le type d'entrée

L'opération set consiste à définir la valeur sur la variable membre threadLocals de le type ThreadLocal.ThreadLocalMap du thread actuel. La clé est la suivante, value C'est la valeur que nous avons spécifiée

Notez que ceci transmis ici représente la variable (ou objet) de type ThreadLocal

Dans d'autres En d'autres termes, chaque thread conserve un objet de type ThreadLocal. Objet ThreadLocal.ThreadLocalMap du thread. Chaque variable ThreadLocal de ce thread est une entrée dans l'objet ThreadLocal.ThreadLocalMap. Puisque chaque variable ThreadLocal correspond à un élément dans ThreadLocal.ThreadLocalMap, ces éléments peuvent être lus, écrits et supprimés.

3.2. Méthode get

La méthode get() consiste à récupérer la variable ThreadLocal correspondante à partir de l'objet ThreadLocal.ThreadLocalMap de le fil de discussion actuel La valeur correspondante

est la même, la méthode Remove() consiste à effacer la valeur

Graphiquement, cela ressemble à ceci :

Ou comme ceci :

4. Scénarios d'utilisation de ThreadLocal

Transmission de valeurs dans le cycle de vie du thread

Enfin , tout crédit à ThreadLocalMap

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer