Di antara pengetahuan threading di Java, program penjualan tiket sangat klasik. Ada juga beberapa masalah dalam program ini!
Persyaratan: Simulasi 100 tiket yang dijual secara bersamaan dalam 3 jendela.
Pertanyaan 1: Mengapa 300 tiket terjual?
Alasan: Karena tiket adalah data variabel anggota non-statis, non-statis akan menyimpan satu bagian data di setiap objek, dan akan ada tiga bagian dari tiga objek utas.
Solusi: Bagikan nomor tiket untuk tiga objek utas. Gunakan modifikasi statis.
Pertanyaan 2: Apakah ada masalah keamanan utas?
Solusi untuk masalah keamanan utas: Sun menyediakan mekanisme sinkronisasi utas bagi kita untuk menyelesaikan masalah jenis ini.
Cara menyinkronkan utas java:
Metode 1: Sinkronisasi Blok Kode
Metode 2: Fungsi Sinkron
Class SellTickets memperluas thread {static int tiket = 1; // Jumlah suara harus didefinisikan sebagai statis di sini. Kalau tidak, variabel anggota non-statis dan data variabel anggota non-statis akan memelihara sepotong data di setiap objek. Akan ada tiga salinan tiga objek utas. Public SellTickets (String ThreadName) {Super (ThreadName); } public void run () {while (true) {disinkronkan ("lock") {if (tiket == 101) {// atau if (tiket> 100) {System.out.println ("Judul telah terjual keluar -_ -..."); merusak; } System.out.println (thread.currentThread (). GetName ()+"menjual"+tiket tiket+"tiket"); tiket ++; /* if (tiket == 101) {// Salah. Saat tiket == 101, hanya satu utas melompat keluar. Tiket ++ ada di dua utas lainnya. merusak; } /* if (thread.currentThread (). getName (). Equals ("window 2")) {// Window 2 hanya dapat menjual paling banyak satu tiket, dan istirahat sudah berakhir; } */} //System.out.println(thread.currentThread (). GetName ()+"lock ..."); }}} kelas publik Demo4 {public static void main (string [] args) {// Buat tiga objek utas dan simulasikan tiga windows sellTickets s1 = new sellTickets ("window 1"); SellTickets S2 = SellTickets baru ("Window 2"); SellTickets S3 = SellTickets baru ("Window 3"); // buka tiket utas s1.start (); s2.start (); s3.start (); System.out.println ("Metode Utama ..."); }}