Rumah Java javaTutorial ThreadLocal解决多线程程序的实例

ThreadLocal解决多线程程序的实例

Jul 26, 2017 pm 04:52 PM
threadlocal belajar

       相信读者在网上也看了很多关于ThreadLocal的资料,很多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路;ThreadLocal的目的是为了解决多线程访问资源时的共享问题。如果你也这样认为的,那现在给你10秒钟,清空之前对ThreadLocal的错误的认知!
看看JDK中的源码是怎么写的:

This class provides thread-local variables. These variables differ from
their normal counterparts in that each thread that accesses one (via its
{@code get} or {@code set} method) has its own, independently initialized
copy of the variable. {@code ThreadLocal} instances are typically private
static fields in classes that wish to associate state with a thread (e.g.,
a user ID or Transaction ID).
Salin selepas log masuk

翻译过来大概是这样的(英文不好,如有更好的翻译,请留言说明):

ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问(通过get或set方法访问)时能保证各个线程里的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private static类型的,用于关联线程和线程的上下文。

可以总结为一句话:ThreadLocal的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。
举个例子,我出门需要先坐公交再做地铁,这里的坐公交和坐地铁就好比是同一个线程内的两个函数,我就是一个线程,我要完成这两个函数都需要同一个东西:公交卡(北京公交和地铁都使用公交卡),那么我为了不向这两个函数都传递公交卡这个变量(相当于不是一直带着公交卡上路),我可以这么做:将公交卡事先交给一个机构,当我需要刷卡的时候再向这个机构要公交卡(当然每次拿的都是同一张公交卡)。这样就能达到只要是我(同一个线程)需要公交卡,何时何地都能向这个机构要的目的。

有人要说了:你可以将公交卡设置为全局变量啊,这样不是也能何时何地都能取公交卡吗?但是如果有很多个人(很多个线程)呢?大家可不能都使用同一张公交卡吧(我们假设公交卡是实名认证的),这样不就乱套了嘛。现在明白了吧?这就是ThreadLocal设计的初衷:提供线程内部的局部变量,在本线程内随时随地可取,隔离其他线程。

(1)ThreadContext为基于键/值对的当前线程提供了一种绑定和非绑定对象的方法。

这个类提供线程局部变量。这些变量与普通的变量不同,因为每个访问一个线程的线程(通过其get或set方法)都有自己的独立初始化变量的副本。

ThreadLocal实例通常是希望将状态与线程关联的类中的私有静态字段(例如:一个用户ID或事务ID)。每个线程都对线程本地变量的副本有一个隐式引用,

只要线程还活着,ThreadLocal实例就可以访问;在一个线程消失之后,所有线程本地实例的副本都将被垃圾收集(除非存在其他引用)。

为线程中保存的对象。即一个类T是线程的一个类属性。

常用的方法有:

 1 public class ThreadLocal<T> { 2  3 //设置属性 4  5 public void set(T value) { 6 Thread t = Thread.currentThread(); 7 ThreadLocalMap map = getMap(t); 8 if (map != null) 9 map.set(this, value);10 else11 createMap(t, value);12 }13 14 //获取属性15 16 public T get() {17 Thread t = Thread.currentThread();18 ThreadLocalMap map = getMap(t);19 if (map != null) {20 ThreadLocalMap.Entry e = map.getEntry(this);21 if (e != null)22 return (T)e.value;23 }24 return setInitialValue();25 }26 27 //获取线程的 ThreadLocal.ThreadLocalMap28 29 ThreadLocalMap getMap(Thread t) {30 return t.threadLocals;31 }32 33 }34 35 //新建一个线程本地的localMap36 37 void createMap(Thread t, T firstValue) {38 t.threadLocals = new ThreadLocalMap(this, firstValue);39 }
Salin selepas log masuk

(2)使用例子:连接、会话如下:

 1 private static ThreadLocal<Connection> connectionHolder 2 = new ThreadLocal<Connection>() { 3 public Connection initialValue() { 4     return DriverManager.getConnection(DB_URL); 5 } 6 }; 7   8 public static Connection getConnection() { 9 return connectionHolder.get();10 }
Salin selepas log masuk
 1 private static final ThreadLocal threadSession = new ThreadLocal(); 2   3 public static Session getSession() throws InfrastructureException { 4     Session s = (Session) threadSession.get(); 5     try { 6         if (s == null) { 7             s = getSessionFactory().openSession(); 8             threadSession.set(s); 9         }10     } catch (HibernateException ex) {11         throw new InfrastructureException(ex);12     }13     return s;14 }
Salin selepas log masuk

 

Atas ialah kandungan terperinci ThreadLocal解决多线程程序的实例. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Belajar untuk menyahpasang pip sepenuhnya dan menggunakan Python dengan lebih cekap Belajar untuk menyahpasang pip sepenuhnya dan menggunakan Python dengan lebih cekap Jan 16, 2024 am 09:01 AM

Tidak perlu lagi pip? Datang dan pelajari cara menyahpasang pip dengan berkesan! Pengenalan: pip ialah salah satu alat pengurusan pakej Python, yang boleh memasang, menaik taraf dan menyahpasang pakej Python dengan mudah. Walau bagaimanapun, kadangkala kita mungkin perlu menyahpasang pip, mungkin kerana kita ingin menggunakan alat pengurusan pakej yang lain, atau kerana kita perlu mengosongkan sepenuhnya persekitaran Python. Artikel ini akan menerangkan cara menyahpasang pip dengan cekap dan memberikan contoh kod khusus. 1. Kaedah menyahpasang pip Berikut akan memperkenalkan dua kaedah biasa untuk menyahpasang pip.

Penyelaman mendalam ke dalam peta warna matplotlib Penyelaman mendalam ke dalam peta warna matplotlib Jan 09, 2024 pm 03:51 PM

Untuk mengetahui lebih lanjut tentang jadual warna matplotlib, anda memerlukan contoh kod khusus 1. Pengenalan matplotlib ialah perpustakaan lukisan Python yang berkuasa Ia menyediakan set fungsi dan alatan lukisan yang kaya yang boleh digunakan untuk mencipta pelbagai jenis carta. Peta warna (peta warna) ialah konsep penting dalam matplotlib, yang menentukan skema warna carta. Kajian mendalam tentang jadual warna matplotlib akan membantu kami menguasai fungsi lukisan matplotlib dengan lebih baik dan menjadikan lukisan lebih mudah.

Bermula dengan Pygame: Tutorial Pemasangan dan Konfigurasi Komprehensif Bermula dengan Pygame: Tutorial Pemasangan dan Konfigurasi Komprehensif Feb 19, 2024 pm 10:10 PM

Pelajari Pygame dari awal: tutorial pemasangan dan konfigurasi lengkap, contoh kod khusus diperlukan Pengenalan: Pygame ialah perpustakaan pembangunan permainan sumber terbuka yang dibangunkan menggunakan bahasa pengaturcaraan Python Ia menyediakan pelbagai fungsi dan alatan, membolehkan pembangun mencipta pelbagai jenis dengan mudah permainan. Artikel ini akan membantu anda mempelajari Pygame dari awal, dan menyediakan tutorial pemasangan dan konfigurasi yang lengkap, serta contoh kod khusus untuk membolehkan anda bermula dengan cepat. Bahagian Pertama: Memasang Python dan Pygame Pertama, pastikan anda mempunyai

Mendedahkan daya tarikan bahasa C: Mendedahkan potensi pengaturcara Mendedahkan daya tarikan bahasa C: Mendedahkan potensi pengaturcara Feb 24, 2024 pm 11:21 PM

Pesona Pembelajaran Bahasa C: Membuka Potensi Pengaturcara Dengan perkembangan teknologi yang berterusan, pengaturcaraan komputer telah menjadi satu bidang yang telah menarik perhatian ramai. Di antara banyak bahasa pengaturcaraan, bahasa C sentiasa digemari oleh pengaturcara. Kesederhanaan, kecekapan dan aplikasinya yang luas menjadikan pembelajaran bahasa C sebagai langkah pertama untuk ramai orang memasuki bidang pengaturcaraan. Artikel ini akan membincangkan daya tarikan mempelajari bahasa C dan cara membuka kunci potensi pengaturcara dengan mempelajari bahasa C. Pertama sekali, daya tarikan mempelajari bahasa C terletak pada kesederhanaannya. Berbanding dengan bahasa pengaturcaraan lain, bahasa C

Mari belajar cara memasukkan nombor akar dalam Word bersama-sama Mari belajar cara memasukkan nombor akar dalam Word bersama-sama Mar 19, 2024 pm 08:52 PM

Semasa mengedit kandungan teks dalam Word, anda kadangkala perlu memasukkan simbol formula. Sesetengah lelaki tidak tahu cara memasukkan nombor akar dalam Word, jadi Xiaomian meminta saya untuk berkongsi dengan rakan saya tutorial tentang cara memasukkan nombor akar dalam Word. Semoga membantu kawan-kawan. Mula-mula, buka perisian Word pada komputer anda, kemudian buka fail yang ingin anda edit, dan gerakkan kursor ke lokasi yang anda perlukan untuk memasukkan tanda akar, rujuk contoh gambar di bawah. 2. Pilih [Sisipkan], dan kemudian pilih [Formula] dalam simbol. Seperti yang ditunjukkan dalam bulatan merah dalam gambar di bawah: 3. Kemudian pilih [Insert New Formula] di bawah. Seperti yang ditunjukkan dalam bulatan merah dalam gambar di bawah: 4. Pilih [Radical], dan kemudian pilih radikal yang sesuai. Seperti yang ditunjukkan dalam bulatan merah dalam gambar di bawah:

Ketahui fungsi utama dalam bahasa Go dari awal Ketahui fungsi utama dalam bahasa Go dari awal Mar 27, 2024 pm 05:03 PM

Tajuk: Pelajari fungsi utama dalam bahasa Go dari awal Sebagai bahasa pengaturcaraan yang mudah dan cekap, bahasa Go digemari oleh pembangun. Dalam bahasa Go, fungsi utama ialah fungsi masuk, dan setiap program Go mesti mengandungi fungsi utama sebagai titik masuk program. Artikel ini akan memperkenalkan cara mempelajari fungsi utama dalam bahasa Go dari awal dan memberikan contoh kod khusus. 1. Pertama, kita perlu memasang persekitaran pembangunan bahasa Go. Anda boleh pergi ke laman web rasmi (https://golang.org

Ketahui fungsi strconv.Atoi dalam dokumentasi bahasa Go untuk menukar rentetan kepada integer Ketahui fungsi strconv.Atoi dalam dokumentasi bahasa Go untuk menukar rentetan kepada integer Nov 03, 2023 am 08:55 AM

Pelajari fungsi strconv.Atoi dalam dokumentasi bahasa Go untuk menukar rentetan kepada integer Bahasa Go ialah bahasa pengaturcaraan yang berkuasa dan fleksibel Pakej strconv dalam pustaka standardnya menyediakan fungsi penukaran rentetan. Dalam siaran ini, kita akan belajar cara menukar rentetan kepada integer menggunakan fungsi strconv.Atoi. Pertama, kita perlu memahami tujuan dan pengisytiharan fungsi strconv.Atoi. Penerangan fungsi dalam dokumen adalah seperti berikut: funcAtoi(sstring)(i

Cepat belajar pemasangan pip dan kuasai kemahiran dari awal Cepat belajar pemasangan pip dan kuasai kemahiran dari awal Jan 16, 2024 am 10:30 AM

Pelajari pemasangan pip dari awal dan kuasai kemahiran dengan cepat Contoh kod khusus diperlukan: pip ialah alat pengurusan pakej Python yang boleh memasang, meningkatkan dan mengurus pakej Python dengan mudah. Bagi pembangun Python, adalah sangat penting untuk menguasai kemahiran menggunakan pip. Artikel ini akan memperkenalkan kaedah pemasangan pip dari awal, dan memberikan beberapa petua praktikal dan contoh kod khusus untuk membantu pembaca menguasai penggunaan pip dengan cepat. 1. Pasang pip Sebelum menggunakan pip, anda perlu memasang pip terlebih dahulu. pip

See all articles