2016-09-30 1 views
3

Ich möchte Thread lokale Variable in einem anderen Thread zugreifen.Ist es möglich, auf die ThreadLocal-Variable mit einem Thread-Objekt zuzugreifen

z.B.

Ich habe Thread-Objekt A für Thread-1,

es eine lokale Variable L1 hat.

und ich habe einen anderen Thread Thread-2, wie kann ich L1 in Thread-2 zugreifen? Danke

+2

Nein. Es würde die Bedeutung von "thread-local" verletzen. Wenn Sie nicht möchten, dass es Thread-lokal ist, verwenden Sie nicht 'ThreadLocal' dafür. – EJP

+0

Setzen Sie die Variable in die Elternklasse –

+0

Es ist in einer anderen Third-Party-Bibliothek, ich kann das nicht ändern. :( – zjffdu

Antwort

2

Nein, weil Speicher Sichtbarkeit. Die gesamte ThreadLocal-Infrastruktur setzt voraus, dass der Zugriff auf die Thread-Local-Objekte Thread-beschränkt ist. Wenn ein anderer Thread den Inhalt eines threadLocal-Objekts manipuliert, gibt es keine Speicherbarriere, um dem ursprünglichen Besitzer-Thread mitzuteilen, dass er seine zwischengespeicherte Version dieses Objekts aktualisieren muss, und der JIT würde nicht wissen, dass er Änderungen von anderen Threads berücksichtigt Nachdenken darüber, welche Anweisungen es neu ordnen kann; Wenn Sie es aktualisieren, könnte der ursprüngliche Thread immer noch eine veraltete Version sehen, ohne dass eine Änderung stattgefunden hat.

Dies ist zusätzlich zu der Beobachtung von yshavit, dass Manipulationen an den Interna einer Drittanbieter-Bibliothek im Allgemeinen eine schlechte Idee sind.

0

Ja, Sie können, mit Reflexion. Jedoch müssen Sie nicht. Aus genau den Gründen, auf die andere hingewiesen haben: Sie sind verpflichtet, Dinge zu brechen oder unerwartete Ergebnisse zu erzielen.

Aber rein für die akademische Demonstration, dass es möglich ist, diese Methode tut, was Sie fragen:

@NotThreadSafe 
Object getValueForThread(ThreadLocal<?> threadLocal, Thread thread) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, NoSuchFieldException { 
    Method getMap = ThreadLocal.class.getDeclaredMethod("getMap", new Class<?>[]{Thread.class}); 
    getMap.setAccessible(true); 
    Object map = getMap.invoke(threadLocal, thread); 
    Class<?> clazz = map.getClass(); 
    Method getEntry = clazz.getDeclaredMethod("getEntry", new Class<?>[]{ThreadLocal.class}); 
    getEntry.setAccessible(true); 
    Object entry = getEntry.invoke(map, threadLocal); 
    Field value = entry.getClass().getDeclaredField("value"); 
    value.setAccessible(true); 
    return value.get(entry); 
} 

Oder zumindest kann es tun, was Sie fragen. Da es keine Sichtbarkeitsgarantien gibt, kann der Thread, der diese Methode aufruft, veraltete Werte sehen. Also noch einmal: tue das nicht.

Verwandte Themen