JavaRush /Java Blog /Random-ID /Rehat kopi #160. Selami lebih dalam Java ThreadLocal. Kel...

Rehat kopi #160. Selami lebih dalam Java ThreadLocal. Kelas pemindai di Java

Dipublikasikan di grup Random-ID

Selami Lebih Dalam Java ThreadLocal

Sumber: Devgenios Hari ini Anda akan mempelajari tentang ThreadLocal, salah satu kelas umum yang digunakan dalam mengembangkan aplikasi Java. Rehat kopi #160.  Selami lebih dalam Java ThreadLocal.  Kelas pemindai di Java - 1

Apa itu ThreadLokal?

Kelas ThreadLocal menyimpan variabel lokal untuk thread. Variabel-variabel ini diisolasi di antara thread yang berbeda dan hanya dapat diakses oleh threadnya sendiri. Kasus penggunaan untuk ThreadLocal :
  1. Isolasi data antar thread.
  2. Manajemen sesi untuk koneksi database.
  3. Menyimpan informasi transaksi thread.

Bagaimana cara menggunakan ThreadLokal?

Mari kita lihat contoh sederhana.
public static void main(String[] args) {
    //Создаем ThreadLocal
    ThreadLocal<String> local = new ThreadLocal<>();
    //Создаем новый класс Random
    Random random = new Random();
    //Создаем 5 потоков
    IntStream.range(0, 5).forEach(a-> new Thread(()-> {
        //Присваиваем meaning каждому потоку
        local.set(a+"  "+random.nextInt(100));
        System.out.println("Thread number and its local value  "+ local.get());
    }).start());
}
Dalam kode di atas, kita membuat kelas ThreadLocal , membuat 5 thread, memberikan nilai ke ThreadLocal di setiap thread dan mencetak. Saat mengeluarkan kita mendapatkan: Rehat kopi #160.  Selami lebih dalam Java ThreadLocal.  Kelas pemindai di Java - 2

Apa yang ada di balik terpal?

Jika Anda perhatikan lebih dekat, Anda dapat melihat bahwa ada dua metode penting di ThreadLocal dari contoh kode ini.
  • publik T dapatkan() {}

  • kumpulan kekosongan publik (nilai T) {}

Mari kita lihat metode penyetel di kode sumber ThreadLocal :
public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
}
Metode penyetel pertama-tama mendapatkan thread saat ini dan memanggil metode getMap() untuk mendapatkan kelas ThreadLocalMap . Jika peta ada, ambil aliran saat ini t sebagai kunci, parameter input sebagai nilai, dan atur pasangan {key:value} ke peta. Jika tidak, buatlah peta . Sekarang Anda mungkin memiliki pertanyaan - apa itu ThreadLocalMap ?
static class ThreadLocalMap {
   /**
    * The entries in this hash map extend WeakReference, using
    * its main ref field as the key (which is always a
    * ThreadLocal object).  Note that null keys (i.e. entry.get()
    * == null) mean that the key is no longer referenced, so the
    * entry can be expunged from table.  Such entries are referred to
    * as "stale entries" in the code that follows.
    */
    static class Entry extends WeakReference<ThreadLocal<?>> {
       /** The value associated with this ThreadLocal. */
       Object value;
       Entry(ThreadLocal<?> k, Object v) {
           super(k);
           value = v;
       }
    }
}
ThreadLocalMap adalah kelas statis internal di ThreadLocal yang mendefinisikan kelas Entry untuk menyimpan data. Entry menggunakan instance ThreadLocal sebagai kunci dan menetapkan nilai yang kita teruskan. Jika ini terdengar terlalu membingungkan pada saat ini, ingatlah bahwa kelas Entry di ThreadLocalMap- lah yang menyimpan nilai sebenarnya. Untuk mendapatkan data dari ThreadLocal kami menggunakan metode pengambil :
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();
}
Dalam metode pengambil , kita akan menggunakan currentThread sebagai kunci untuk mendapatkan ThreadLocalMap . Kemudian map akan getEntry() berdasarkan instance ThreadLocal dan mengembalikan instance Entry dan kemudian nilai yang disimpan. Berikut diagram untuk membantu Anda mengetahuinya: Rehat kopi #160.  Selami lebih dalam Java ThreadLocal.  Kelas pemindai di Java - 3Rehat kopi #160.  Selami lebih dalam Java ThreadLocal.  Kelas pemindai di Java - 4
  1. Setiap thread menyimpan referensi ke ThreadLocalMap .

  2. ThreadLocalMap adalah kelas statis dalam ThreadLocal dan menggunakan kelas Entry untuk penyimpanan.

  3. Kunci ThreadLocalMap adalah turunan dari ThreadLocal dan dapat memiliki beberapa ThreadLocals .

  4. ThreadLocal sendiri tidak menyimpan nilai, tetapi merupakan kunci untuk thread yang akan membantu mendapatkan nilai dari ThreadLocalMap .

Perhatikan bahwa lebih baik menghapus ThreadLocal untuk menghindari OOM (Out-of-Memory Error) karena referensi “lemah” di kelas Entry .

Kelas pemindai di Java

Sumber: Medium Posting ini akan membantu Anda mengenal kelas Scanner di Java. Rehat kopi #160.  Selami lebih dalam Java ThreadLocal.  Kelas pemindai di Java - 5Kelas Scanner pada Java merupakan kelas yang kita gunakan ketika ingin mendapatkan nilai dari pengguna. Cara termudah untuk memahaminya adalah dengan contoh, jadi mari kita lihat lebih jelas. Membuat kelas Scanner adalah salah satu dari tiga langkah yang kami ambil untuk mendapatkan nilai dari pengguna. Langkah pertama adalah membuat objek dari kelas pemindai.
Scanner scan=new Scanner(System.in);
Sekarang kita memiliki objek pemindai. Objek ini akan memiliki properti Scanner dari kelas Scanner . Setelah langkah pertama, pengguna sudah dapat memasukkan nilai yang diinginkan, namun jika kita tidak memandu pengguna dan menampilkan nilai tersebut di konsol atau di aplikasi, maka dari segi kegunaannya tidak akan terlalu baik. Oleh karena itu, lebih baik untuk menginformasikan dan membimbing pengguna:
System.out.println("Please enter your name");
String name=scan.next();
System.out.println("Your Name:"+name);
Di baris pertama kami menanyakan pengguna apa yang kami inginkan darinya. Ini sebenarnya tidak ada hubungannya dengan pemindai, tapi selalu baik untuk memberikan petunjuk kepada pengguna Anda. Pada baris kedua kita akan menetapkan nilai yang dimasukkan pengguna ke dalam data dan menyimpannya sehingga kita dapat menggunakannya nanti. Di baris terakhir kita melihat bahwa kita dapat menggunakan nilai yang diterima dari pengguna sesuai kebijaksanaan kita. Mari tambahkan beberapa detail lagi ke kode kita:
System.out.println("Please enter your last name");

String lastName=scan.next();

System.out.println("Your Name " + name + " " + "Your Last Name" + lastName);
Pada dasarnya, kami mengulangi dua baris sebelumnya, menanyakan nilainya kepada pengguna dan menyimpannya. Sekarang di baris terakhir kami menggunakan dua nilai yang kami ambil dari pengguna dan sekarang digunakan bersama.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION