


Bagaimana untuk melaksanakan keselamatan benang dalam pengaturcaraan serentak 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!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

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

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

Stock Market GPT
Penyelidikan pelaburan dikuasakan AI untuk keputusan yang lebih bijak

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)

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.

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.

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

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.

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.

Jawapannya ialah menggunakan thread.currentThread ().

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.

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.
