Simulasi Implementasi Kelas Threadlocal: Variabel bersama dalam rentang utas, masing -masing utas hanya dapat mengaksesnya, dan tidak dapat mengakses utas lain.
Paket com.ljq.test.thread; AB MODUL * @Author Administrator * */Public Class ThreadScoPesharedata {// Siapkan data int statis privat yang dibagikan = 0; <Thread, integer> (); // Modifikasi data di utas saat ini, berikan informasi modifikasi int data = acak baru () .out.println (thread.currenthread (). getName () + "telah menempatkan data:" + data); ;}} Kelas statis A {public void get () {int data = threadData.get (thread.currentThread ()); public void () {int data = threadData.get (thread.currentThread ()) Baca saat ini.
Jalankan Hasil:
Peran dan Tujuan Threadlocal:
Untuk berbagi data di utas, yaitu, untuk kode program yang sama, beberapa modul harus dibagikan saat berjalan di utas yang sama, dan data lain dibagikan saat berjalan di utas lain.
Setiap utas memanggil metode yang ditetapkan dari objek threadlocal global, yang setara dengan menambahkan catatan ke peta internal. Di akhir utas, Anda dapat memanggil metode threadlocal.clear (), sehingga memori akan dilepaskan lebih cepat, dan tidak apa -apa untuk menyebutnya karena utas juga dapat secara otomatis melepaskan variabel utas terkait.
Skenario aplikasi ThreadLocal:
Pemrosesan pesanan berisi serangkaian operasi: Kurangi inventaris, tambahkan akun akun yang berjalan, dan ubah akun umum. , jika tidak, semua operasi dikirimkan, yang mengharuskan operasi ini menggunakan objek koneksi basis data yang sama, dan kode operasi ini berada di kelas modul yang berbeda.
Transfer bank termasuk serangkaian operasi: Kurangi saldo transfer dari akun dan tingkatkan saldo transfer ke akun. Operasi Transfer Kode adalah metode dari dua objek akun yang berbeda.
Misalnya, ActionContext of Strut2, ketika kode yang sama dipanggil dan dijalankan oleh utas yang berbeda, data yang dioperasikan oleh kode ini adalah status dan data masing -masing utas Sebuah utas, tidak peduli berapa kali memanggil metode GetContext dan metode GetContext di mana modul di mana modulnya sama.
Kasus Eksperimental: Tentukan variabel threadlocal yang dibagikan global, dan kemudian mulai beberapa utas untuk menyimpan nilai acak ke variabel threadlocal, dan kemudian panggil berbagai metode lain dari berbagai kategori lainnya , Anda dapat melihat bahwa beberapa kelas berbagi data yang sama di utas yang sama.
Untuk merangkum variabel threadlocal, sehingga dunia luar tidak boleh secara langsung mengoperasikan variabel threadlocal.
Aplikasi ini relatif jarang untuk pengemasan jenis data dasar.
Pengemasan data jenis objek lebih umum, yaitu, biarkan kelas tertentu membuat objek instan independen untuk utas yang berbeda.
Paket com.ljq.test.thread; memberikan objek instan. <2; i ++) {utas baru (runnable baru () () {@Override public void run () {int data = new random (). NextInt (); System.out.println (thread.currentThread (). x x. "Name" + Data); Metode Statis Metode yang sesuai A {public void get () {int data = x.get (); ); .getage ()); "," + mydata.getage ());}} // Gunakan metode statis metode statis B {public void get () {int data = x .get (); .Currenthread (). GetMyData: " + mydata.getName () +", " + mydata.getage ()); rivate mythreadscopedata () {} // Berikan metode instan. dan jangan saling mengganggu. Kumpulan data dalam rentang utas saat ini statis Threadlocal <mythreadscopedata> peta = Threadlocal baru <mythreadscopeedata> (); .Name = name;} public int getage () {return usia;} public void setage (int usia) {this.age = usia;}}}