Jadual Kandungan
1 Apakah itu keselamatan utas
2. Atomicity
2.1 Keadaan perlumbaan
2.2 Operasi komposit
3. Mekanisme penguncian
3.1 Kunci terbina dalam
3.2 Kemasukan Semula
4. Gunakan kunci untuk melindungi keadaan
5. Keaktifan dan prestasi
Rumah Java javaTutorial Bagaimana untuk melaksanakan keselamatan benang dalam pengaturcaraan serentak Java

Bagaimana untuk melaksanakan keselamatan benang dalam pengaturcaraan serentak Java

May 21, 2023 pm 03:14 PM
java

    1 Apakah itu keselamatan utas

    Apabila berbilang utas mengakses kelas, tanpa mengira kaedah panggilan yang digunakan oleh persekitaran masa jalan atau utas. pelaksanaan dilaksanakan secara bergilir-gilir, dan kelas ini boleh menunjukkan tingkah laku yang betul tanpa sebarang penyegerakan atau penyelarasan tambahan dalam kod panggilan utama, maka kelas ini dikatakan selamat untuk benang.

    Objek tanpa status mestilah selamat untuk benang, seperti: Servlet.

    2. Atomicity

    2.1 Keadaan perlumbaan

    Keadaan perlumbaan berlaku apabila keputusan yang salah berlaku disebabkan oleh pemasaan pelaksanaan yang tidak betul.

    Operasi "semak dahulu dan kemudian laksana" adalah untuk memutuskan tindakan seterusnya berdasarkan kemungkinan hasil pemerhatian praktikal. Contohnya: pemula malas.

    if(instance == null) {
        instance = new SomeObject();
    }

    Operasi "Baca-ubah suai-tulis", keadaan hasil bergantung pada keadaan sebelumnya. Seperti: operasi kenaikan.

    long count = 0;
    count++;

    2.2 Operasi komposit

    Kendalian atom bermaksud bahawa untuk semua operasi yang mengakses keadaan yang sama (termasuk operasi itu sendiri), operasi ini dilakukan dengan cara atom (tidak boleh dibahagikan).

    Untuk memastikan keselamatan benang, satu set operasi yang mesti dilakukan secara atom disertakan, dipanggil operasi kompaun.

    Operasi tambahan boleh menggunakan kelas selamat benang sedia ada untuk memastikan keselamatan benang. Contohnya:

    AtomicLong count = new AtomicLong(0);
    count.incrementAndGet();

    3. Mekanisme penguncian

    Jika kelas hanya mempunyai satu pembolehubah keadaan, anda boleh memastikan keselamatan urutan kelas dengan menggunakan pembolehubah keadaan selamat benang. Apabila kelas mempunyai lebih banyak keadaan, ia tidak mencukupi untuk hanya menambah lebih banyak pembolehubah keadaan selamat benang. Untuk memastikan ketekalan keadaan, semua pembolehubah keadaan yang berkaitan mesti dikemas kini dalam satu operasi atom.

    3.1 Kunci terbina dalam

    Java menyediakan kunci terbina dalam: blok kod disegerakkan, yang merangkumi: rujukan objek sebagai kunci , objek sebagai Blok kod yang dilindungi oleh kunci ini.

    Kaedah yang diubah suai dengan kata kunci synchronized ialah blok kod penyegerakan yang merangkumi keseluruhan badan kaedah, di mana kunci blok kod penyegerakan ialah objek di mana panggilan kaedah berada. Kaedah synchronized statik menggunakan objek Kelas sebagai kunci.

    Apabila benang memasuki blok kod disegerakkan, kunci diperoleh secara automatik dan apabila benang keluar dari blok kod disegerakkan, kunci dilepaskan secara automatik. Paling banyak satu utas boleh memegang kunci ini, jadi kod penyegerakan dilaksanakan secara atom.

    3.2 Kemasukan Semula

    Kunci terbina dalam ialah masuk semula, yang bermaksud bahawa butiran operasi untuk memperoleh kunci ialah benang, bukan panggilan. Apabila benang cuba mendapatkan semula kunci yang telah dipegang olehnya, permintaan itu juga berjaya.

    Reentrancy menambah baik pengkapsulan gelagat mengunci dan memudahkan pembangunan kod serentak berorientasikan objek.

    public class Widget {
        public synchronized void doSomething() {
            //......
        }
    }
    public class LoggingWidget extends Widget {
        public synchronized void doSomething() {
            //......
            super.doSomething();//假如没有可重入的锁,该语句将产生死锁。
        }
    }

    4. Gunakan kunci untuk melindungi keadaan

    Untuk pembolehubah keadaan boleh ubah yang boleh diakses oleh berbilang benang pada masa yang sama, anda perlu memegang kunci yang sama semasa mengaksesnya , dikatakan pembolehubah keadaan dilindungi oleh kunci ini.

    5. Keaktifan dan prestasi

    Penggunaan kunci berbutir kasar memastikan keselamatan benang, tetapi boleh menyebabkan masalah prestasi dan keaktifan, seperti:

    @ThreadSafe
    public class SynchronizedFactorizer implements Servlet {
        @GuardedBy("this") private BigInteger lastNumber;
        @GuardedBy("this") private BigInteger[] lastFactors;
    
        public synchronized void service(ServletRequest req,
                                         ServletResponse resp) {
            BigInteger i = extractFromRequest(req);
            if (i.equals(lastNumber))
                encodeIntoResponse(resp, lastFactors);
            else {
                BigInteger[] factors = factor(i);//因数分解计算
                lastNumber = i;
                lastFactors = factors;//存放上一次计算结果
                encodeIntoResponse(resp, factors);
            }
        }
    }

    Anda boleh memastikan keselarasan servlet dan mengekalkan keselamatan benang dengan mengecilkan blok kod penyegerakan. Jangan bahagikan operasi atom kepada berbilang blok kod disegerakkan dan cuba pisahkan operasi yang tidak menjejaskan keadaan kongsi dan mengambil masa yang lama untuk dilaksanakan daripada kod disegerakkan. Seperti:

    public class CachedFactorizer implements Servlet {
        @GuardedBy("this") private BigInteger lastNumber;
        @GuardedBy("this") private BigInteger[] lastFactors;
    
        public void service(ServletRequest req, ServletResponse resp) {
            BigInteger i = extractFromRequest(req); 
            BigInteger[] factors = null;      
            synchronized (this) {
                if (i.equals(lastNumber)) {
                   factors = lastFactors.clone();
                }         
            }    
            if (factors == null) {        
                factors = factor(i);
                synchronized (this) {
                   lastNumber = i;
                   lastFactors = factors.clone();
                }
            }
            encodeIntoResponse(resp, factors);
        }
    }

    Atas ialah kandungan terperinci Bagaimana untuk melaksanakan keselamatan benang dalam pengaturcaraan serentak Java. 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

    Undress AI Tool

    Undress AI Tool

    Gambar buka pakaian secara percuma

    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.

    Stock Market GPT

    Stock Market GPT

    Penyelidikan pelaburan dikuasakan AI untuk keputusan yang lebih bijak

    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)

    Topik panas

    Tempat mencari folder Tempat mencari folder Sep 20, 2025 am 07:57 AM

    Cara yang paling langsung adalah untuk mengingati lokasi penyimpanan, biasanya dalam folder seperti desktop, dokumen, muat turun, dan lain -lain; Jika ia tidak dapat dijumpai, anda boleh menggunakan fungsi carian sistem. Fail "Hilang" kebanyakannya disebabkan oleh masalah seperti tanpa pengawasan laluan penjimatan, sisihan memori nama, penyegerakan fail atau penyegerakan awan. Cadangan Pengurusan yang cekap: Klasifikasi mengikut projek, masa, dan jenis, memanfaatkan akses cepat, bersih dan arkib dengan kerap, dan menyeragamkan penamaan. Windows Search and Cari melalui File Explorer dan Taskbar, manakala MacOS bergantung pada Finder dan Spotlight, yang lebih bijak dan lebih cekap. Menguasai alat dan membangunkan tabiat yang baik adalah kunci.

    Bagaimana untuk menambah fail balang ke ClassPath di Java? Bagaimana untuk menambah fail balang ke ClassPath di Java? Sep 21, 2025 am 05:09 AM

    Gunakan parameter -CP untuk menambah balang ke ClassPath, supaya JVM dapat memuatkan kelas dan sumber dalamannya, seperti Java -Cplibrary.Jarcom.Example.Main, yang menyokong pelbagai balang yang dipisahkan oleh titik -titik komisul atau kolon, dan juga boleh dikonfigurasikan melalui pembolehubah persekitaran kelas atau manifest.mf.

    Cara membuat fail di Java Cara membuat fail di Java Sep 21, 2025 am 03:54 AM

    UseFile.createenewfile () tocreateafileonlyifitdoesneteTexist, mengelakkan penulisan; 2.preferfiles.createFile () darinio.2formodern, safeFileCreationThatFailSiffileexists;

    Mengapa sistem masa nyata memerlukan jaminan tindak balas deterministik? Mengapa sistem masa nyata memerlukan jaminan tindak balas deterministik? Sep 22, 2025 pm 04:03 PM

    Sistem masa nyata memerlukan tindak balas deterministik, kerana ketepatan bergantung pada masa penghantaran hasil; Sistem masa nyata yang sukar memerlukan tarikh akhir yang ketat, terlepas akan membawa kepada bencana, sementara masa nyata yang lembut membolehkan kelewatan sekali-sekala; Faktor-faktor yang tidak ditentukan seperti penjadualan, gangguan, cache, pengurusan memori, dan lain-lain mempengaruhi masa; Pelan pembinaan termasuk pemilihan RTO, analisis WCET, pengurusan sumber, pengoptimuman perkakasan dan ujian yang ketat.

    Cara memaksa laman web skala oleh UC Browser_UC Browser's Skala Web Laman Web oleh Penyemak Imbas UC Cara memaksa laman web skala oleh UC Browser_UC Browser's Skala Web Laman Web oleh Penyemak Imbas UC Sep 24, 2025 pm 04:54 PM

    Pertama, aktifkan fungsi skala terbina dalam penyemak imbas UC, pergi ke Tetapan → Layari Tetapan → Font dan Typesetting atau Page Scaling, dan pilih nisbah pratetap atau peratusan tersuai; Kedua, anda boleh memaksa saiz paparan halaman dengan membuka atau mencubit gerak isyarat dengan dua jari; Untuk laman web yang menyekat skala, anda boleh meminta versi desktop laman web untuk membuka kunci sekatan; Pengguna lanjutan juga boleh mengubah suai atribut Viewport dengan melaksanakan kod JavaScript di bar alamat untuk mencapai kesan skala paksa yang lebih fleksibel.

    Bagaimana untuk mendapatkan nama kaedah panggilan di Java? Bagaimana untuk mendapatkan nama kaedah panggilan di Java? Sep 24, 2025 am 06:41 AM

    Jawapannya ialah menggunakan thread.currentThread ().

    Penggunaan CPU Tinggi Microsoft Edge Penggunaan CPU Tinggi Microsoft Edge Sep 24, 2025 am 12:17 AM

    Edge menduduki CPU yang tinggi kerana penggunaan sumber yang tinggi berdasarkan kernel kromium, ditambah dengan faktor-faktor seperti halaman multi-tab, plug-in berjalan, skrip laman web dan mekanisme rendering; Penyelesaian termasuk: 1. Tutup sambungan yang tidak perlu untuk mengurangkan beban latar belakang; 2. Dayakan fungsi "Tag Tidur" untuk mengurangkan penggunaan sumber tag terbiar; 3. Bersihkan proses latar belakang dan tutup tetapan yang berkaitan dengan GPU; 4. Kemas kini penyemak imbas dan sistem untuk memastikan keserasian dan pengoptimuman prestasi.

    Bagaimana menggunakan kelas pilihan untuk mengelakkan NullPointerException di Java? Bagaimana menggunakan kelas pilihan untuk mengelakkan NullPointerException di Java? Sep 25, 2025 am 06:04 AM

    Kelas pilihan digunakan untuk mengendalikan nilai -nilai yang selamat yang mungkin menjadi batal, mengelakkan pengecualian penunjuk null. 1. Buat contoh menggunakan pilihan. Nullable untuk mengendalikan nilai null. 2. Semak dan nilai akses melalui ISPRESENT atau Keselamatan IFPRESENT untuk mengelakkan panggilan langsung untuk menyebabkan pengecualian. 3. Gunakan Orelse dan Orelseget untuk memberikan nilai lalai, atau gunakan Orelsethrow untuk membuang pengecualian tersuai. 4. Menukar atau menapis nilai melalui operasi peta dan penapis rantaian untuk meningkatkan kebolehbacaan kod dan ketahanan.

    See all articles