Pemprosesan serentak
1. [Mandatori] Mendapatkan objek tunggal mesti memastikan keselamatan benang, dan kaedah juga mesti memastikan keselamatan benang.
Nota: Kelas dipacu sumber, kelas alatan dan kelas kilang tunggal semuanya memerlukan perhatian.
2 [Wajib] Sila nyatakan nama utas yang bermakna semasa membuat rangkaian atau kumpulan utas untuk memudahkan pengesanan semula apabila ralat berlaku.
Contoh positif:
public class TimerTaskThread extends Thread { public TimerTaskThread(){ super.setName("TimerTaskThread"); ... }
3. [Mandatori] Sumber benang mesti disediakan melalui kumpulan benang, dan penciptaan benang dalam aplikasi tidak dibenarkan.
Penjelasan: Kelebihan menggunakan kumpulan benang adalah untuk mengurangkan masa yang dihabiskan untuk mencipta dan memusnahkan benang dan overhed sumber sistem, dan menyelesaikan masalah sumber yang tidak mencukupi. Jika kumpulan benang tidak digunakan, ia boleh menyebabkan sistem mencipta sejumlah besar benang serupa, yang membawa kepada penggunaan memori atau masalah "penukaran berlebihan".
4. [Mandatori] Kumpulan benang tidak dibenarkan dibuat menggunakan Pelaksana, tetapi melalui kaedah pemprosesan
ini membolehkan pelajar menulis lebih jelas tentang peraturan operasi kumpulan benang dan mengelakkan risiko daripada keletihan sumber. . yang mungkin terkumpul besar bilangan permintaan, menghasilkan OOM.
2) CachedThreadPool dan
ScheduledThreadPool:Bilangan utas yang dibenarkan untuk dibuat ialah Integer.MAX_VALUE, yang mungkin menghasilkan sejumlah besar utas, menghasilkan OOM.
5 [Mandatori] SimpleDateFormat ialah kelas yang tidak selamat pada benang Secara amnya, ia tidak sepatutnya ditakrifkan sebagai pembolehubah statik, ia mesti dikunci atau menggunakan kelas alat DateUtils.
Contoh positif:Beri perhatian kepada keselamatan benang dan gunakan DateUtils. Pemprosesan berikut juga disyorkan: private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() {
@ Override
protected DateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd");
}
};
Nota: Jika ia adalah aplikasi JDK 8, anda boleh menggunakan Instant dan bukannya Date, LocalDateTime dan bukannya Kalendar,
6 [Wajib] Apabila konkurensi tinggi, panggilan segerak harus mempertimbangkan kehilangan prestasi kunci. Jika anda boleh menggunakan struktur data tanpa kunci, jangan gunakan kunci jika anda boleh mengunci blok, jangan kunci keseluruhan badan kaedah jika anda boleh menggunakan kunci objek, jangan gunakan kunci kelas.
7. [Mandatori] Apabila mengunci berbilang sumber, jadual pangkalan data dan objek pada masa yang sama, anda perlu mengekalkan susunan penguncian yang konsisten, jika tidak, ia boleh menyebabkan kebuntuan.
Explanation: Thread seseorang perlu mengunci semua jadual a, b, dan c sebelum ia dapat melakukan operasi kemas kini. mungkin berlaku.
8 [Wajib] Apabila mengubah suai rekod yang sama secara serentak, untuk mengelakkan kehilangan kemas kini, sama ada menguncinya pada lapisan aplikasi, menguncinya dalam cache atau menggunakan penguncian optimistik pada lapisan
Nota:
Jika kebarangkalian konflik setiap akses kurang daripada 20%, adalah disyorkan untuk menggunakan penguncian optimistik, jika tidak gunakan penguncian pesimis. Bilangan percubaan semula untuk penguncian optimistik mestilah tidak kurang daripada 3 kali.
9 [Wajib] Apabila berbilang benang memproses tugas yang dijadualkan secara selari, apabila Pemasa menjalankan berbilang TimeTasks, selagi salah satu daripadanya tidak menangkap pengecualian yang dilemparkan, tugasan lain akan ditamatkan secara automatik kes apabila menggunakan soalan ScheduledExecutorService.
10. dilaksanakan untuk mengelakkan tidak dapat melaksanakan utas utama
Untuk kaedah countdown, keputusan tidak akan dikembalikan sehingga tamat masa.
Perhatikan bahawa timbunan pengecualian yang dilemparkan oleh benang kanak-kanak tidak boleh dicapai dengan cuba - tangkap dalam benang utama.
11 [Disyorkan] Elakkan kejadian Rawak digunakan oleh berbilang urutan Walaupun perkongsian contoh ini selamat untuk benang, ia akan menyebabkan penurunan prestasi disebabkan persaingan untuk benih yang sama.
Contoh rawak termasuk java util .
Contoh positif:Selepas JDK 7, anda boleh menggunakan API ThreadLocalRandom secara langsung Sebelum JDK 7, anda boleh mencapai satu kejadian setiap thread.
12. [Cadangan] Gunakan penguncian yang disemak dua kali (dalam senario serentak) untuk mengoptimumkan bahaya tersembunyi pemulaan tertunda (rujuk Perisytiharan " Penguncian Berganda - Diperiksa Telah Patah "), disyorkan Penyelesaian yang lebih mudah untuk masalah tersebut (terpakai untuk JDK 5 dan ke atas) adalah untuk mengisytiharkan harta sasaran sebagai tidak menentu.
Contoh pembilang:
class Foo { private Helper helper = null; public Helper getHelper() { if (helper == null) synchronized(this) { if (helper == null) helper = new Helper(); } return helper; } // other functions and members... }
13. [Rujukan] tidak menentu menyelesaikan masalah memori yang tidak kelihatan dalam berbilang benang. Untuk satu penulisan dan banyak bacaan, masalah penyegerakan berubah boleh diselesaikan, tetapi jika terdapat banyak penulisan, masalah keselamatan benang tidak dapat diselesaikan. Jika ia adalah operasi count ++, gunakan kelas berikut untuk melaksanakannya: AtomicInteger count = new AtomicInteger( ); mempunyai prestasi yang lebih baik daripada AtomicLong (kurangkan keyakinan bilangan percubaan semula kunci).
14 [Rujukan] Apabila HashMap mempunyai kapasiti yang tidak mencukupi untuk mengubah saiz, pautan mati mungkin berlaku kerana konkurensi yang tinggi, menyebabkan CPU meningkat.
15 [Rujukan] ThreadLocal tidak dapat menyelesaikan masalah kemas kini objek kongsi. Adalah disyorkan untuk menggunakan pengubahsuaian statik untuk objek ThreadLocal. Pembolehubah ini adalah biasa kepada semua operasi dalam utas, jadi ia ditetapkan sebagai pembolehubah statik Semua kejadian tersebut berkongsi pembolehubah statik ini, yang bermaksud bahawa ia dimuatkan apabila kelas digunakan untuk kali pertama dan hanya sekeping ruang storan. diperuntukkan. Objek kelas (hanya ditakrifkan dalam urutan ini) boleh memanipulasi pembolehubah ini.