Pemahaman singkat tentang perbedaan antara proses dan utas dalam sistem operasi:
Proses: Setiap proses memiliki kode independen dan ruang data (konteks proses), dan beralih antar proses akan memiliki overhead yang besar. Suatu proses berisi utas 1-N. (Proses adalah unit terkecil dari alokasi sumber daya)
Thread: Jenis utas yang sama berbagi kode dan ruang data. Setiap utas memiliki Stack dan Program Counter (PC) independen (PC), dan overhead switching utasnya kecil. (Thread adalah unit penjadwalan CPU terkecil)
Seperti suatu proses, utas dibagi menjadi lima tahap: pembuatan, siap, berjalan, memblokir, dan berakhir.
Multi-proses berarti bahwa sistem operasi dapat menjalankan banyak tugas (program) secara bersamaan.
Multithreading mengacu pada beberapa aliran berurutan yang dieksekusi dalam program yang sama. Pertama -tama, pengoperasian menabung dan penarikan uang harus berulir, dan mungkin ada banyak pelanggan. Ini berarti bahwa harus ada beberapa utas, dan beberapa utas bersama -sama mengoperasikan bank, dan jumlah bank perlu disinkronkan. Hanya dengan memastikan keamanan utas.
Jadi, mari kita masukkan contoh kode ini di sini. Jika ada yang salah, tolong tunjukkan. Karena seorang lelaki tua bertanya tentang kode multi-threaded ini.
Pertama -tama, bank, penciptaan model objek ini.
Paket com.lxk.threadtest.bank;/*** Model bank, atribut jumlah total. * <p> * * @author lxk pada 2017/6/26 */Bank kelas publik {/** * Beri bank modal start-up, jika tidak, bagaimana Anda bisa melakukan bisnis. */int private int sum = 200; // Ini tidak pernah digunakan seperti ini, tetapi juga merupakan mekanisme penguncian yang benar: menyinkronkan blok kode. // objek obj = objek baru (); /*** Hemat uang* Jika Anda tidak menambahkan [disinkronkan-fungsi sinkronisasi], masalah keselamatan multi-utas akan terjadi. */public disinkronkan void add (int n) {// disinkronkan (obj) {sum = sum + n; coba {thread.sleep (10);} catch (pengecualian abaikan) {} // Ketika jumlah waktu yang lebih banyak menjadi lebih banyak, Anda dapat menemukan bahwa utas penyelamatan uang memang dua melakukan tindakan penyelamatan. System.out.println (thread.currentThread (). GetName () + "... sum =" + sum); //}}/*** Tarik uang* Jika Anda tidak menambahkan [disinkronkan-fungsi sinkronisasi], masalah keamanan multithread akan terjadi. */void yang disinkronkan publik mengurangi (int n) {if (sum - n> = 0) {sum = sum - n;} else {System.out.println ("Uang Bank tidak cukup!");} coba {thread.sleep (30);} tangkapan Anda (pengecualian abaikan) {} // Ketika jumlah waktu yang lebih banyak, 30 -an. menghemat uang. System.out.println (thread.currentThread (). GetName () + "... sum =" + sum);}}Ada dua metode dalam kode: Simpan dan Ambil, dua metode ini, dan jumlah total, dan beberapa berkomentar kode. Itu sederhana dan mudah dimengerti, penguncian multi-threaded saling eksklusif, dan memastikan sinkronisasi antar utas.
Namun, ini adalah metode yang jarang. Metode yang umum digunakan adalah menggunakan kata kunci yang disinkronkan untuk memodifikasi metode sinkronisasi.
Model Objek Klien
package com.lxk.threadTest.bank;/** * Customer, implement the runnable() interface, and multiple people can save money together* * @author lxk on 2017/6/26 */public class Customer implements Runnable {/** * Saving type*/static final String TYPE_ADD = "add";/** * withdrawal type*/static final String TYPE_REDUCE = "reduce";/** * Bank*/Bank Bank Pribadi;/***Jenis Operasi untuk Uang, Penghematan atau Penarikan*/Jenis String Pribadi;/***Jumlah operasi secara teoritis jumlah positif*/waktu int pribadi;/***Berapa banyak yang menghemat atau menarik*/uang int swasta; ini. uang;}@override public void run () {for (int x = 0; x <time; x ++) {if (type_add.equals (type)) {bank.add (uang);} lain jika (type_reduce.equals (type)) {bank.reduce (uang);}}}}Sebagai objek pelanggan, karena banyak pelanggan dapat mengakses bank secara bersamaan, pengoperasian menabung dan menarik uang diterapkan menggunakan utas.
Atribut dibangun untuk melewati nilainya.
Metode utama
Paket com.lxk.threadtest.bank;/** * Contoh multi-threaded bank menyetor uang * <p> * [Persyaratan:] * Bank memiliki lemari besi. * Ada dua deposan yang menyetor atau menarik N * 100 masing -masing. * Tujuan: Apakah ada masalah keamanan dengan program ini? Jika demikian, bagaimana cara menyelesaikannya? * <p> * [Cara menemukan masalah:] * 1. Bersihkan kode mana yang merupakan kode multi-utas. * 2. Jelas berbagi data. * 3. Khapus pernyataan mana dalam kode multi-utas beroperasi pada data bersama. * * @author lxk pada 2017/6/26 */kelas publik utama {public static void main (string [] args) {// satu bank dan beberapa pelanggan bank bank = bank baru (); int time = 10000; int uang = 100; // pelanggan ini menghemat uang c1 = pelanggan baru (pelanggan, pelanggan, pelanggan.type_add, waktu, uang); waktu, uang); utas t1 = utas baru (c1); utas t2 = utas baru (c2); t1.start (); t2.start ();}}Efek operasi aktual dari kode di atas ditunjukkan pada gambar di bawah ini.
Jika berapa kali setoran dan penarikan uang kecil, Anda dapat melihat bahwa kedua utas tersebut memiliki urutan. Karena itu, kami memiliki beberapa kali yang lebih besar. Kemudian, kita akan melihat situasi seperti yang ditunjukkan pada gambar. Thread 1 menarik uang, dan ketika utas 0 menghemat uang, Anda dapat melihat bahwa kedua utas tersebut dieksekusi diselingi, dengan penyimpanan dan penarikan, dan tidak ada pola.
Ini memastikan sinkronisasi data.
Adapun bagaimana keluar dari sinkronisasi, yaitu, fenomena abnormal,
Anda dapat menghapus kata kunci yang disinkronkan dari metode tambah, mengurangi berapa kali dan mengubahnya menjadi 3 kali, dan mengatur nilai awal jumlah menjadi 0. Coba kode lagi,
Anda akan menemukan fenomena async yang disebut.
Hasil dari out-of-sinkronisasi di sisi kanan gambar di atas adalah bahwa kedua orang menghemat 100 setiap kali, tiga kali. Apakah jumlah total diperoleh? 100.200.300.400.500.600. Butuh waktu lama.
Namun, hasil operasinya tidak
Pada saat ini, jika Anda menambahkan disinkronkan ke metode ADD, hasil grafik di sebelah kiri akan muncul, yang merupakan hasil yang benar.
Saya menambahkan metode lain demi keberadaan dan penarikan. Kode menjadi seperti apa di atas.
Ini hampir semua contoh sinkronisasi antar-thread.
Saya akan merekam kode secara singkat. Saat digunakan, Anda bisa mengeluarkannya dalam hitungan menit.
Meringkaskan
Di atas adalah kode lengkap dari artikel ini tentang simulasi masalah sinkronisasi multithreaded Java menggunakan penarikan bank sebagai contoh. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke situs ini:
Contoh pemrograman multithreaded java
Prinsip dan implementasi Timer Java Multithreaded Timer
Java memahami multi-threading dengan menjual tiket
Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!