1. Konsep proses dan utas
(1) Dalam sistem operasi tradisional, program tidak dapat berjalan secara mandiri, dan sebagai unit dasar alokasi sumber daya dan operasi independen adalah semua proses.
Dalam sistem tanpa OS, metode eksekusi program adalah eksekusi berurutan, yaitu, satu program harus dieksekusi sebelum program lain dapat dieksekusi; Dalam lingkungan multi-program, banyak program diizinkan untuk dieksekusi secara bersamaan. Ada perbedaan yang signifikan antara dua cara pelaksanaan suatu program. Justru karakteristik eksekusi program yang bersamaan yang mengarah pada pengenalan konsep proses dalam sistem operasi.
Karena orang mengusulkan konsep proses pada 1960 -an, proses selalu digunakan dalam OS sebagai unit dasar yang dapat memiliki sumber daya dan dijalankan secara mandiri. Sampai pertengahan 1980-an, orang mengusulkan unit dasar yang dapat berjalan secara independen, utas, yang lebih kecil dari proses, untuk mencoba menggunakannya untuk meningkatkan tingkat pelaksanaan program bersamaan dalam sistem, sehingga lebih lanjut meningkatkan throughput sistem. Terutama setelah memasuki tahun 1990-an, sistem multi-prosesor telah berkembang dengan cepat. Thread dapat meningkatkan pelaksanaan program paralel daripada proses dan sepenuhnya memberikan keunggulan multi-prosesor. Oleh karena itu, utas telah diperkenalkan dalam OS multi-prosesor yang diluncurkan dalam beberapa tahun terakhir untuk meningkatkan kinerja OS.
"Di atas dikutip dari " Sistem Operasi Komputer - Diedit oleh Tang Xiaodan dan Lainnya - Edisi 3 " (Alamat Unduh)
(2) Gambar berikut adalah penjelasan dari pengguna Zhihu:
Melalui pemahaman umum di atas, kami pada dasarnya tahu apa yang dilakukan utas dan proses. Jadi mari kita ringkas konsep untuk proses dan utas di bawah ini:
(3) Proses adalah aktivitas yang berjalan dari suatu program di komputer tentang kumpulan data tertentu, ini adalah unit dasar dari alokasi dan penjadwalan sumber daya sistem, dan itu adalah dasar dari struktur sistem operasi. Dalam struktur komputer yang berorientasi pada proses awal, proses adalah entitas eksekusi dasar program; Dalam struktur komputer yang berorientasi benang kontemporer, proses adalah wadah benang. Suatu program adalah deskripsi instruksi, data, dan bentuk organisasinya, dan suatu proses adalah entitas program.
(4) Benang, kadang -kadang disebut proses ringan (LWP), adalah unit terkecil dari aliran eksekusi program. Thread adalah proses kontrol berurutan tunggal dalam suatu program. Unit eksekusi yang relatif independen dan dapat dijadwalkan dalam proses adalah unit dasar penjadwalan independen dan pengiriman CPU dalam sistem, yang mengacu pada unit penjadwalan program yang menjalankan. Menjalankan beberapa utas secara bersamaan dalam satu program untuk menyelesaikan pekerjaan yang berbeda, yang disebut Multithreading.
(5) Hubungan antara proses dan utas:
2. Java mengimplementasikan metode multi-threading
(1) Warisan utas dan menulis ulang metode run ()
kelas publik MyThread memperluas thread {@Override public void run () {while (true) {System.out.println (this.currentThread (). getName ()); }} public static void main (string [] args) {mythread thread = new mythread (); thread.start (); // Cara yang benar untuk memulai utas}}Hasil output:
Thread-0thread-0thread-0 ...
Selain itu, Anda perlu memahami bahwa metode start () adalah metode start () alih -alih metode run (). Jika metode run () digunakan, maka itu adalah metode biasa untuk dieksekusi.
(2) Menerapkan antarmuka yang dapat dijalankan
kelas publik MyRunnable mengimplementasikan runnable {@Override public void run () {System.out.println ("123"); } public static void main (string [] args) {myrunnable myrunnable = new myrunnable (); Thread thread = utas baru (myRunnable, "t1"); thread.start (); }}3. Keamanan utas
Konsep Keselamatan Thread: Ketika beberapa utas mengakses kelas tertentu (objek atau metode), kelas selalu dapat menunjukkan perilaku yang benar, dan kemudian kelas ini (objek atau metode) aman-aman.
Keamanan utas adalah ketika mengakses multi-threads, mekanisme penguncian diadopsi. Ketika utas mengakses data kelas tertentu, itu dilindungi. Utas lain tidak dapat mengaksesnya sampai utas selesai membacanya, dan utas lainnya tidak dapat menggunakannya. Tidak akan ada inkonsistensi data atau polusi data. Thread tidak aman, yang berarti mereka tidak memberikan perlindungan akses data. Ada kemungkinan bahwa beberapa utas dapat mengubah data satu demi satu, menghasilkan data yang dihasilkan kotor. Mekanisme penguncian umum di sini adalah: disinkronkan
4. Pengubah Sinkronisasi
(1) Sinkronisasi: Anda dapat menambahkan kunci ke objek dan metode apa pun, dan kode yang terkunci disebut "area mutex" atau "area kritis".
(2) ** Jangan gunakan ** instance yang disinkronkan (kode a):
public class MyThread extends Thread {private int count = 5;@Override public void run() {count--;System.out.println(this.currentThread().getName() + " count:" + count);}public static void main(String[] args) {MyThread myThread = new MyThread();Thread thread1 = new Thread(myThread, "thread1");Thread thread2 = new Thread (mythread, "thread2"); thread thread3 = thread baru (mythread, "thread3"); thread thread4 = thread baru (myThread, "thread4"); thread5 = utas baru (mythread, "thread5"); thread1.start (); thread.Salah satu hasil dari output adalah sebagai berikut:
Thread3 Count: 2Thread4 Count: 1Thread1 Count: 2Thread2 Count: 3Thread5 Count: 0
Dapat dilihat bahwa hasil di atas salah, karena beberapa utas mengoperasikan metode run () pada saat yang sama dan memodifikasi jumlah, yang pada gilirannya menyebabkan kesalahan.
(3) ** Gunakan ** instance yang disinkronkan (kode b):
kelas publik MyThread memperluas utas {private int count = 5; @Override public disinkronkan void run () {count--; System.out.println (this.currentThread (). GetName () + "count:" + count); } public static void main (string [] args) {mythread mythread = mythread baru (); Thread thread1 = utas baru (mythread, "thread1"); Thread thread2 = utas baru (mythread, "thread2"); Thread thread3 = utas baru (mythread, "thread3"); Thread thread4 = utas baru (mythread, "thread4"); Thread thread5 = utas baru (mythread, "thread5"); thread1.start (); thread2.start (); thread3.start (); thread4.start (); thread5.start (); }}Hasil output:
Thread1 Count: 4Thread2 Count: 3Thread3 Count: 2Thread5 Count: 1Thread4 Count: 0
Dapat dilihat bahwa perbedaan antara kode A dan kode B adalah bahwa modifikasi yang disinkronkan ditambahkan ke metode run ().
Deskripsi adalah sebagai berikut:
Ketika beberapa utas mengakses metode MyThread Run, jika modifikasi yang disinkronkan digunakan, multi-thread akan diproses dalam antrian (antrian di sini ditentukan sesuai dengan urutan alokasi CPU). Jika utas ingin menjalankan kode dalam metode modifikasi yang disinkronkan, pertama -tama mencoba untuk mendapatkan kunci. Jika mendapatkan kunci, jalankan konten dari badan kode yang disinkronkan. Jika tidak bisa mendapatkan kunci, utas akan terus mencoba mendapatkan kunci sampai mendapatkannya. Selain itu, beberapa utas bersaing untuk mengunci pada saat yang sama, yang berarti bahwa kompetisi kunci akan terjadi.
5. Objek memiliki kunci! Beberapa utas dan beberapa kunci!
Apa itu, satu objek memiliki satu kunci, banyak utas memiliki banyak kunci! Pertama, mari kita lihat kode contoh di bawah ini (kode C):
kelas publik multithread {private int num = 200; Publik disinkronkan void printNum (string threadName, string tag) {if (tag.equals ("a")) {num = num - 100; System.out.println (threadName + "Tag a, atur num over!"); } else {num = num - 200; System.out.println (ThreadName + "Tag" + Tag + ", num =" + num); } public static void main (string [] args) melempar interruptedException {final multithread multithread1 = new MulithRead (); multithread final multithread2 = multithread baru (); utas baru (runnable baru () {public void run () {multithread1.printnum ("thread1", "a");}}). start (); Thread.sleep (5000); System.out.println ("Tunggu 5 detik untuk memastikan Thread1 telah dieksekusi!"); utas baru (runnable baru () {public void run () {multithread2.printnum ("thread2", "b");}}). start (); }}Hasil output:
Tag thread1 A, atur num over! thread1 tag a, num = 100wait 5 detik untuk memastikan thread1 telah dieksekusi! tag thread2 b, atur num over! thread2 tag b, num = 0
Dapat dilihat bahwa ada dua objek: Multithread1 dan Multithread2. Jika beberapa objek menggunakan kunci yang sama, hasil eksekusi di atas harus: tag thread2 b, num = -100. Oleh karena itu, setiap objek memiliki kunci objek itu.
Kunci yang diperoleh dengan kata kunci yang disinkronkan adalah kunci objek, daripada memperlakukan sepotong kode atau metode sebagai kunci. Oleh karena itu, dalam contoh kode C di atas, utas mana yang pertama kali menjalankan metode kata kunci yang disinkronkan, utas memegang kunci objek yang dimiliki metode tersebut. Utas memperoleh dua kunci berbeda dari dua objek yang berbeda, dan mereka saling melengkapi.
Jadi, dalam skenario normal, harus ada situasi di mana semua objek akan beroperasi pada jumlah variabel, jadi bagaimana mengimplementasikannya? Sangat mudah untuk menambahkan statis. Kita tahu bahwa semua objek di kelas ini memiliki referensi yang sama, tidak peduli berapa banyak objek yang dipakai, panggilan adalah metode, dan kodenya adalah sebagai berikut (kode d):
kelas publik multithread {private static int num = 200; public static static void printNum (string threadName, string tag) {if (tag.equals ("a")) {num = num - 100; System.out.println (threadName + "Tag a, atur num over!"); } else {num = num - 200; System.out.println (threadName + "Tag b, atur num over!"); } System.out.println (threadName + "tag" + tag + ", num =" + num); } public static void main (string [] args) melempar interruptedException {final multithread multithread1 = new MulithRead (); multithread final multithread2 = multithread baru (); utas baru (runnable baru () {public void run () {multithread1.printnum ("thread1", "a");}}). start (); Thread.sleep (5000); System.out.println ("Tunggu 5 detik untuk memastikan Thread1 telah dieksekusi!"); utas baru (runnable baru () {public void run () {multithread2.printnum ("thread2", "b");}}). start (); }}Hasil output:
Tag thread1 A, atur num over! thread1 tag a, num = 100wait 5 detik untuk memastikan thread1 telah dieksekusi! Tag Thread2 B, Setel Num Over! Tag Thread2 B, Num = -100
Dapat dilihat bahwa menambahkan modifikasi statis ke variabel dan metode dapat mewujudkan skenario yang kita butuhkan. Ini juga menunjukkan bahwa untuk metode atau variabel modifikasi statis non-statis, objek yang terkunci.
6. Kunci objek sinkron dan asinkron
(1) disinkronkan
Konsep sinkronisasi adalah berbagi. Kita perlu tahu bahwa kata "berbagi" bukan sumber daya bersama, tidak perlu disinkronkan, yaitu, tidak perlu menguncinya;
Tujuan sinkronisasi adalah untuk memastikan keamanan utas. Bahkan, untuk keamanan utas, dua karakteristik paling mendasar perlu dipenuhi: atomisitas dan visibilitas;
(2) Asynchronized: Asynchronized
Konsep asinkron adalah kemandirian, tanpa ada kendala antara satu sama lain, dan tidak ada hubungan antara keduanya.
(3) Kode Sampel:
kelas publik myObject {public void method () {System.out.println (thread.currentThread (). getName ()); } public static void main (string [] args) {final myobject myObject = new myobject (); Thread t1 = utas baru (runnable baru () {public void run () {myobject.method ();}}, "t1"); Thread t2 = utas baru (runnable baru () {public void run () {myobject.method ();}}, "t2"); t1.start (); t2.start (); }}Dalam kode di atas, metode () adalah metode asinkron.
Meringkaskan
Di atas adalah seluruh konten artikel ini tentang solusi awal untuk konsep threading, proses dan disinkronkan dalam java multi-threading. Saya harap ini akan membantu semua orang. Jika ada kekurangan, silakan tinggalkan pesan dan tunjukkan, dan editor akan membalas semua orang tepat waktu.