


Prinsip dan senario penggunaan Disegerakkan dalam Java dan analisis penggunaan dan perbezaan antara muka Boleh Panggil
1. Ciri asas
1. Ia bermula dengan penguncian yang optimistik, ia akan ditukar kepada penguncian yang pesimis
2. Mulakan dengan pelaksanaan kunci ringan Jika kunci dipegang untuk masa yang lama, ia akan ditukar menjadi kunci kelas berat.3 Kunci putaran berkemungkinan besar digunakan apabila melaksanakan kunci ringan Kunci >2. Proses penguncian JVM membahagikan kunci yang disegerakkan kepada keadaan kunci bebas kunci, berat sebelah, kunci ringan dan kunci berat. Ia akan dinaik taraf secara berurutan mengikut situasi.Bias lock
Anggap bahawa protagonis lelaki adalah kunci dan protagonis perempuan adalah benang Jika hanya benang ini menggunakan kunci ini, maka lelaki protagonis dan protagonis wanita Walaupun protagonis tidak mendapat sijil perkahwinan (mengelakkan operasi kos tinggi), dia masih boleh hidup bahagia Namun, protagonis wanita muncul dan cuba bersaing untuk protagonis lelaki, tidak kira betapa mahalnya operasi mendapatkan sijil nikah, srikandi mesti juga Tindakan ini selesai, biarlah protagonis wanita menyerah
Kunci berat sebelah tidak benar-benar "mengunci", ia hanya membuat "tanda kunci berat sebelah" dalam pengepala objek untuk merekodkan benang mana yang dimiliki oleh kunci Jika tiada benang susulan lain untuk bersaing untuk kunci, maka tidak perlu melakukan operasi penyegerakan lain (mengelakkan overhed mengunci dan membuka kunci jika lain). benang bersaing untuk mendapatkan kunci kemudian (ia baru sahaja direkodkan dalam objek kunci yang mempunyai benang kunci semasa, ia adalah mudah Kenal pasti sama ada benang yang sedang memohon kunci ialah benang yang direkodkan sebelum ini), kemudian batalkan keadaan kunci berat sebelah asal dan masukkan keadaan kunci ringan umum
Penguncian berat sebelah pada asasnya bersamaan dengan "penguncian tertunda". tanda itu, jika tidak, anda tidak boleh membezakan bila penguncian sebenar diperlukan
Kunci ringanApabila utas lain memasuki pertandingan, keadaan kunci berat sebelah dihapuskan, masukkan Status kunci ringan (kunci putaran mudah suai di sini dilaksanakan melalui CAS >Semak dan kemas kini sekeping memori melalui CAS (seperti null => dirujuk oleh utas)Jika kemas kini berjaya, penguncian dianggap berjayaJika kemas kini gagal, kunci dianggap sibuk dan penantian seperti putaran berterusan (tanpa melepaskan CPU).Operasi putaran adalah Mengekalkan CPU melahu adalah pembaziran sumber CPU Oleh itu, putaran di sini tidak akan berterusan selama-lamanya , tetapi akan berhenti berputar selepas mencapai masa tertentu/bilangan percubaan semula Ini adalah apa yang dipanggil "adaptif"Kunci heavyweightJika persaingan menjadi lebih sengit dan putaran tidak dapat memperoleh. status kunci dengan cepat, ia akan berkembang menjadi kunci kelas berat Kunci kelas berat di sini merujuk kepada penggunaan mutex yang disediakan oleh kernel.Untuk melakukan operasi mengunci, mula-mula masukkan keadaan kernel.Dalam keadaan kernel, tentukan sama ada kunci semasa sudah didudukiJika kunci tidak diduduki, penguncian berjaya dan suis Kembali ke mod pengguna.Jika kunci telah diisi , kunci gagal Pada masa ini, utas memasuki baris gilir menunggu kunci dan tergantung Menunggu untuk dikejutkan oleh sistem pengendalian.Selepas beberapa siri, kunci itu dikeluarkan oleh utas lain. , dan sistem pengendalian juga mengingati benang yang digantung, jadi ia membangkitkan benang dan cuba mendapatkan semula kunci 3. Operasi pengoptimuman lain Penghapusan kunci Pengkompil + JVM menentukan sama ada kunci boleh dihapuskan Jika boleh, hapuskan sahaja terus Sesetengah kod aplikasi menggunakan disegerakkan, tetapi ia sebenarnya tidak digunakan dalam persekitaran berbilang benang (Contohnya, StringBuffer)
Pada masa ini, setiap panggilan untuk ditambahkan akan melibatkan penguncian dan membuka kunci. . Pemimpin, terangkan tugas kerja kepada orang bawahan
Kaedah 1:
Panggil, terangkan tugasan 1, tutup telefon.
Panggil, terangkan tugasan 2. Tutup telefon.
Panggil, beri tugas 3, tutup telefon
StringBuffer sb = new StringBuffer(); sb.append("a"); sb.append("b"); sb.append("c"); sb.append("d");
Boleh Dipanggil ialah antara muka Ia bersamaan dengan merangkumkan "nilai pulangan" dalam utas Ia adalah mudah untuk pengaturcara menggunakan pelbagai benang. Hasil pengiraan.
Callable 和 Runnable 相对, 都是描述一个 "任务". Callable 描述的是带有返回值的任务, Runnable 描述的是不带返回值的任务.Callable 通常需要搭配 FutureTask 来使用. FutureTask 用来保存 Callable 的返回结果. 因为 Callable 往往是在另一个线程中执行的, 啥时候执行完并不确定. FutureTask 就可以负责这个等待结果出来的工作.
代码示例: 创建线程计算 1 + 2 + 3 + ... + 1000, 不使用 Callable 版本
public class Text { static class Result{ public int sum = 0; public Object locker = new Object(); } public static void main(String[] args) throws InterruptedException { Result result = new Result(); Thread t = new Thread(){ @Override public void run() { int sum = 0; for (int i = 0; i <=10000; i++){ sum += i; } result.sum = sum; synchronized (result.locker){ result.locker.notify(); } } }; t.start(); synchronized (result.locker){ while (result.sum == 0){ result.locker.wait(); } } System.out.println(result.sum); } }
代码示例: 创建线程计算 1 + 2 + 3 + ... + 1000, 使用 Callable 版本
import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class Text1 { public static void main(String[] args) throws ExecutionException, InterruptedException { Callable<Integer> callable = new Callable<Integer>() { @Override public Integer call() throws Exception { int sum = 0; for (int i = 0; i <=1000; i++){ sum += i; } return sum; } }; //由于Thread不能直接传一个callable实例,就需要一个辅助类来包装 FutureTask<Integer> futureTask = new FutureTask<>(callable); Thread t = new Thread(futureTask); t.start(); //尝试在主线程获取结果 //如果FutureTask中的结果还没生成。此时就会阻塞等待 //一直等到最终的线程把这个结果算出来,get返回 Integer result = futureTask.get(); System.out.println(result); } }
Atas ialah kandungan terperinci Prinsip dan senario penggunaan Disegerakkan dalam Java dan analisis penggunaan dan perbezaan antara muka Boleh Panggil. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Panduan Nombor Sempurna di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor Perfect dalam Java?, contoh dengan pelaksanaan kod.

Panduan untuk Penjana Nombor Rawak di Jawa. Di sini kita membincangkan Fungsi dalam Java dengan contoh dan dua Penjana berbeza dengan contoh lain.

Panduan untuk Weka di Jawa. Di sini kita membincangkan Pengenalan, cara menggunakan weka java, jenis platform, dan kelebihan dengan contoh.

Panduan untuk Nombor Smith di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor smith di Jawa? contoh dengan pelaksanaan kod.

Dalam artikel ini, kami telah menyimpan Soalan Temuduga Spring Java yang paling banyak ditanya dengan jawapan terperinci mereka. Supaya anda boleh memecahkan temuduga.

Java 8 memperkenalkan API Stream, menyediakan cara yang kuat dan ekspresif untuk memproses koleksi data. Walau bagaimanapun, soalan biasa apabila menggunakan aliran adalah: bagaimana untuk memecahkan atau kembali dari operasi foreach? Gelung tradisional membolehkan gangguan awal atau pulangan, tetapi kaedah Foreach Stream tidak menyokong secara langsung kaedah ini. Artikel ini akan menerangkan sebab -sebab dan meneroka kaedah alternatif untuk melaksanakan penamatan pramatang dalam sistem pemprosesan aliran. Bacaan Lanjut: Penambahbaikan API Java Stream Memahami aliran aliran Kaedah Foreach adalah operasi terminal yang melakukan satu operasi pada setiap elemen dalam aliran. Niat reka bentuknya adalah

Panduan untuk TimeStamp to Date di Java. Di sini kita juga membincangkan pengenalan dan cara menukar cap waktu kepada tarikh dalam java bersama-sama dengan contoh.

Kapsul adalah angka geometri tiga dimensi, terdiri daripada silinder dan hemisfera di kedua-dua hujungnya. Jumlah kapsul boleh dikira dengan menambahkan isipadu silinder dan jumlah hemisfera di kedua -dua hujungnya. Tutorial ini akan membincangkan cara mengira jumlah kapsul yang diberikan dalam Java menggunakan kaedah yang berbeza. Formula volum kapsul Formula untuk jumlah kapsul adalah seperti berikut: Kelantangan kapsul = isipadu isipadu silinder Dua jumlah hemisfera dalam, R: Radius hemisfera. H: Ketinggian silinder (tidak termasuk hemisfera). Contoh 1 masukkan Jejari = 5 unit Ketinggian = 10 unit Output Jilid = 1570.8 Unit padu menjelaskan Kirakan kelantangan menggunakan formula: Kelantangan = π × r2 × h (4
