Jadual Kandungan
1. Ciri asas
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
Kaedah 1:
Panggil, terangkan tugasan 1, tutup telefon.
Rumah Java javaTutorial Prinsip dan senario penggunaan Disegerakkan dalam Java dan analisis penggunaan dan perbezaan antara muka Boleh Panggil

Prinsip dan senario penggunaan Disegerakkan dalam Java dan analisis penggunaan dan perbezaan antara muka Boleh Panggil

Apr 21, 2023 am 08:04 AM
java synchronized callable

    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 Prinsip dan senario penggunaan Disegerakkan dalam Java dan analisis penggunaan dan perbezaan antara muka Boleh Panggil

    Kunci berat sebelah bukan penguncian sebenar, tetapi hanya merekodkan tanda dalam pengepala objek kunci (merakam benang yang menjadi milik kunci). Jika tiada utas lain mengambil bahagian dalam bersaing untuk kunci, maka operasi penguncian tidak akan dilakukan, sekali gus mengurangkan overhed program Setelah utas lain benar-benar terlibat Pertandingan Benang, kemudian batalkan keadaan kunci berat sebelah, masukkan keadaan kunci ringan

    Kunci ringan

    Apabila 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 berjaya

    Jika 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 heavyweight

    Jika 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 diduduki

    Jika 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");
    Salin selepas log masuk
    Kaedah 2:

    Panggil, beri tugas 1, tugas 2, tugas 3, tutup telefon

    4. Antara muka boleh dipanggil

    Apa itu Boleh Dipanggil

    Prinsip dan senario penggunaan Disegerakkan dalam Java dan analisis penggunaan dan perbezaan antara muka Boleh PanggilBoleh 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);
        }
    }
    Salin selepas log masuk

    代码示例: 创建线程计算 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);
        }
    }
    Salin selepas log masuk

    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!

    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

    AI Hentai Generator

    AI Hentai Generator

    Menjana ai hentai secara percuma.

    Artikel Panas

    R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
    4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Tetapan grafik terbaik
    4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
    4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25: Cara Membuka Segala -galanya Di Myrise
    1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

    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)

    Nombor Sempurna di Jawa Nombor Sempurna di Jawa Aug 30, 2024 pm 04:28 PM

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

    Penjana Nombor Rawak di Jawa Penjana Nombor Rawak di Jawa Aug 30, 2024 pm 04:27 PM

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

    Weka di Jawa Weka di Jawa Aug 30, 2024 pm 04:28 PM

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

    Nombor Smith di Jawa Nombor Smith di Jawa Aug 30, 2024 pm 04:28 PM

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

    Soalan Temuduga Java Spring Soalan Temuduga Java Spring Aug 30, 2024 pm 04:29 PM

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

    Cuti atau kembali dari Java 8 Stream Foreach? Cuti atau kembali dari Java 8 Stream Foreach? Feb 07, 2025 pm 12:09 PM

    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

    TimeStamp to Date in Java TimeStamp to Date in Java Aug 30, 2024 pm 04:28 PM

    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.

    Program Java untuk mencari kelantangan kapsul Program Java untuk mencari kelantangan kapsul Feb 07, 2025 am 11:37 AM

    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

    See all articles