Bagaimana untuk menggunakan kunci dalam Go?
Dalam pengaturcaraan serentak, kunci ialah mekanisme yang digunakan untuk melindungi sumber yang dikongsi. Dalam bahasa Go, kunci adalah salah satu alat penting untuk mencapai keselarasan. Ia memastikan bahawa apabila sumber dikongsi diakses secara serentak oleh berbilang coroutine, hanya satu coroutine boleh membaca atau mengubah suai sumber ini. Artikel ini akan memperkenalkan penggunaan kunci dalam bahasa Go untuk membantu pembaca lebih memahami pengaturcaraan serentak.
- Kunci Pengecualian Bersama
Kunci Pengecualian Bersama ialah mekanisme penguncian yang paling biasa digunakan dalam bahasa Go. Ia memastikan bahawa hanya satu coroutine boleh mengakses bahagian kritikal pada masa yang sama. Dalam istilah orang awam, kunci mutex memastikan bahawa hanya satu coroutine boleh mengaksesnya pada masa yang sama dengan membungkus sumber yang dikongsi dalam bahagian kritikal kunci.
Menggunakan kunci mutex dalam bahasa Go adalah sangat mudah. Kita boleh menggunakan jenis Mutex dalam pakej penyegerakan untuk mencipta kunci mutex:
import "sync" var mutex = &sync.Mutex{}
Selepas itu, di lokasi sumber yang dikongsi perlu dilindungi, kita boleh menggunakan kod berikut untuk memperoleh kunci:
mutex.Lock() defer mutex.Unlock()
berbaloi Ambil perhatian bahawa kunci mutex tidak menyokong kemasukan semula. Jika coroutine telah memperoleh kunci, cuba mendapatkan kunci itu semula akan mengakibatkan kebuntuan. Oleh itu, kami biasanya menggunakan pernyataan penangguhan untuk melepaskan kunci secara automatik apabila coroutine tamat.
Berikut ialah contoh penggunaan mutex:
import ( "fmt" "sync" ) var count = 0 var mutex = &sync.Mutex{} func increment(wg *sync.WaitGroup) { mutex.Lock() defer mutex.Unlock() count++ wg.Done() } func main() { var wg sync.WaitGroup for i := 0; i < 1000; i++ { wg.Add(1) go increment(&wg) } wg.Wait() fmt.Println("Count:", count) }
Dalam contoh ini, kami menggunakan mutex untuk melindungi kaunter. 1000 coroutine melaksanakan fungsi kenaikan pada masa yang sama, menambah 1 pada kaunter setiap kali. Disebabkan oleh penggunaan kunci mutex, program boleh mengeluarkan nilai pembilang akhir dengan betul.
- Kunci Baca-Tulis
Dalam persekitaran berbilang coroutine, Kunci Baca-Tulis mungkin lebih baik daripada kunci mutex. Sebaliknya, ia boleh kekal cekap apabila berbilang coroutine membaca daripada sumber yang dikongsi secara serentak, tetapi masih memerlukan akses yang saling eksklusif apabila terdapat operasi tulis.
Kunci baca-tulis terdiri daripada dua jenis kunci: kunci baca dan kunci tulis. Kunci baca membenarkan berbilang coroutine mengakses sumber yang dikongsi pada masa yang sama, tetapi kunci tulis memastikan bahawa hanya satu coroutine boleh mengaksesnya pada masa yang sama.
Dalam bahasa Go, anda boleh menggunakan jenis RWMutex dalam pakej penyegerakan untuk mencipta kunci baca-tulis.
import "sync" var rwlock = &sync.RWMutex{}
Kaedah pemerolehan kunci baca dan kunci tulis adalah berbeza. Berikut ialah beberapa penggunaan biasa:
- Perolehi kunci baca: rwlock.RLock()
- Lepaskan kunci baca: rwlock.RUnlock()
- Peroleh kunci tulis: rwlock .Lock()
- Lepaskan kunci tulis: rwlock.Unlock()
Berikut ialah contoh penggunaan kunci baca-tulis:
import ( "fmt" "sync" ) var count = 0 var rwlock = &sync.RWMutex{} func increment(wg *sync.WaitGroup) { rwlock.Lock() defer rwlock.Unlock() count++ wg.Done() } func read(wg *sync.WaitGroup) { rwlock.RLock() defer rwlock.RUnlock() fmt.Println("Count:", count) wg.Done() } func main() { var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go increment(&wg) } wg.Wait() for i := 0; i < 5; i++ { wg.Add(1) go read(&wg) } wg.Wait() }
Dalam ini contoh , kami membuka 10 coroutine secara serentak untuk menulis data ke kaunter dan 5 coroutine untuk membaca data kaunter. Dengan menggunakan kunci baca-tulis, atur cara boleh membaca daripada sumber yang dikongsi dengan cara yang cekap sambil memastikan keatoman operasi tulis.
- Operasi atom
Dalam bahasa Go, anda juga boleh menggunakan operasi atom untuk memastikan bahawa operasi primitif penyegerakan adalah atom. Operasi atom tidak memerlukan penguncian dan oleh itu lebih cekap daripada kunci dalam beberapa situasi.
Bahasa Go mempunyai berbilang fungsi operasi atom terbina dalam, anda boleh merujuk kepada dokumentasi rasmi. Berikut ialah dua fungsi operasi atom yang biasa digunakan: atomic.Add dan atomic.Load.
- atom.Tambah: Lakukan operasi penambahan atom pada integer.
- atom.Beban: Baca nilai integer secara atom.
Berikut ialah contoh:
import ( "fmt" "sync/atomic" "time" ) var count int32 = 0 func increment(wg *sync.WaitGroup) { defer wg.Done() atomic.AddInt32(&count, 1) } func printCount() { fmt.Println("Count: ", atomic.LoadInt32(&count)) } func main() { var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) go increment(&wg) } wg.Wait() printCount() time.Sleep(time.Second) for i := 0; i < 3; i++ { wg.Add(1) go increment(&wg) } wg.Wait() printCount() }
Dalam contoh ini, kami menggunakan fungsi atom.Tambah untuk melaksanakan operasi penambahan atom pada pembilang, dan fungsi atom.Muatkan ke membaca nilai pembilang secara atom. Dengan menggunakan operasi atom, kita boleh mengelakkan overhed kunci dan mencapai pengaturcaraan serentak yang lebih cekap.
- Ringkasan
Bahasa Go menyediakan pelbagai mekanisme penyegerakan, termasuk kunci mutex, kunci baca-tulis dan operasi atom. Menggunakan mekanisme penyegerakan yang sesuai dalam pengaturcaraan serentak adalah kunci untuk memastikan program berjalan dengan betul dan cekap. Untuk mengelakkan kebuntuan, kita perlu memikirkan dengan teliti tentang mekanisme kunci mana yang paling sesuai untuk sumber yang dikongsi semasa. Dalam bahasa Go, cara menggunakan kunci adalah sangat mudah. Perlu diingatkan bahawa masa memegang kunci harus dikurangkan sebanyak mungkin untuk mengelakkan pengurangan prestasi program.
Atas ialah kandungan terperinci Bagaimana untuk menggunakan kunci dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

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

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

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

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)

Topik panas



Dalam Go, pemalar ialah pengecam yang mengekalkan nilai tetap dan tidak berubah sepanjang pelaksanaan program. Pemalar dalam Go diisytiharkan menggunakan kata kunci const. Dalam artikel ini, kami akan meneroka cara menggunakan pemalar dalam Go. Cara mengisytiharkan pemalar Mengisytiharkan pemalar dalam Go adalah sangat mudah, hanya gunakan kata kunci const. Formatnya adalah seperti berikut: constidentifier[type]=value dengan pengecam ialah nama tetap

Bahasa Go ialah bahasa pengaturcaraan yang mudah dan cekap yang juga digunakan secara meluas dalam bidang pembangunan web. Dalam pembangunan web, penghalaan adalah bahagian penting. Pengumpulan penghalaan ialah fungsi penghalaan yang lebih maju, yang boleh menjadikan kod lebih jelas dan ringkas, serta meningkatkan kebolehbacaan dan kebolehselenggaraan kod. Artikel ini akan memperkenalkan secara terperinci cara melaksanakan kumpulan penghalaan dalam bahasa Go daripada kedua-dua aspek pelaksanaan prinsip dan kod. 1. Prinsip pengelompokan Pengelompokan laluan adalah setara dengan pengelompokan dan pengurusan beberapa laluan yang mempunyai ciri yang serupa. Sebagai contoh, kita boleh menukar semua API

Abstrak: Artikel ini terutamanya memperkenalkan amalan terbaik dalam projek pembangunan bahasa Go. Dengan menerangkan pengalaman dalam reka bentuk struktur projek, pengendalian ralat, pemprosesan serentak, pengoptimuman prestasi dan ujian, ia membantu pembangun menghadapi cabaran dalam projek sebenar dengan lebih baik. 1. Reka bentuk struktur projek Sebelum memulakan projek bahasa Go, reka bentuk struktur projek yang baik adalah penting. Struktur projek yang baik boleh meningkatkan kecekapan kerjasama pasukan dan mengurus kod dan sumber projek dengan lebih baik. Berikut ialah beberapa amalan terbaik untuk struktur projek: Asingkan kod sebanyak mungkin

Mekanisme penyegerakan bahasa pergi termasuk: 1. Kunci Mutex, yang merupakan salah satu primitif penyegerakan paling asas dalam go 2. Baca dan tulis kunci mutex, yang boleh meningkatkan prestasi serentak 3. Pembolehubah keadaan, digunakan antara berbilang goroutine Penyegerakan primitif untuk komunikasi; 4. Saluran, mekanisme utama untuk komunikasi antara goroutine; 5. Operasi atom, mekanisme untuk operasi mudah yang mencapai keselamatan serentak;

Cara mengoptimumkan pensirilan dan penyahserilan JSON dalam pembangunan bahasa Go, JSON (JavaScriptObjectNotation) ialah format pensirilan dan penyahserilan yang kerap digunakan. Ia ringkas, boleh dibaca dan mudah untuk berinteraksi dengan merentasi platform yang berbeza. Walau bagaimanapun, apabila memproses data yang besar atau senario konkurensi tinggi, prestasi pensirilan dan penyahsirian JSON mungkin menjadi hambatan prestasi. Artikel ini akan memperkenalkan beberapa kaedah pengoptimuman untuk pensirilan JSON dan penyahsirilan dalam pembangunan bahasa Go.

Cara menggunakan bahasa Go untuk amalan penyelarasan kod Dalam pembangunan perisian moden, prestasi adalah pertimbangan yang sangat penting. Untuk meningkatkan kecekapan pelaksanaan kod, kita boleh menggunakan teknologi pengaturcaraan selari. Sebagai bahasa pengaturcaraan serentak, bahasa Go mempunyai banyak alatan dan ciri penyejajaran yang boleh membantu kami mencapai penyelarasan kod yang baik. Artikel ini akan memperkenalkan cara menggunakan bahasa Go untuk amalan selari kod, bermula daripada pemprosesan konkurensi asas kepada pengoptimuman algoritma selari yang kompleks. Pemprosesan Concurrency Asas Pemprosesan Concurrency merujuk kepada melaksanakan pelbagai tugas pada masa yang sama.

Bagaimana untuk menyelesaikan masalah konkurensi kod yang dihadapi dalam Java Pengenalan: Dalam pengaturcaraan Java, menghadapi masalah konkurensi adalah situasi yang sangat biasa. Masalah konkurensi merujuk kepada apabila berbilang rangkaian mengakses dan mengendalikan sumber dikongsi pada masa yang sama, yang mungkin membawa kepada hasil yang tidak dapat diramalkan. Masalah ini mungkin termasuk perlumbaan data, kebuntuan, livelock, dsb. Artikel ini akan memperkenalkan beberapa kaedah biasa dan berkesan untuk menyelesaikan masalah konkurensi di Jawa. 1. Kawalan penyegerakan: kata kunci disegerakkan: kata kunci disegerakkan ialah kata kunci penyegerakan paling asas dalam Java

Sebagai bahasa pengaturcaraan yang sangat baik, Java digunakan secara meluas dalam pembangunan peringkat perusahaan. Antaranya, pengaturcaraan berbilang benang adalah salah satu kandungan teras Java. Dalam artikel ini, kami akan memperkenalkan cara menggunakan teknik pengaturcaraan berbilang benang dalam Java, serta contoh kod khusus. Cara Mencipta Benang Terdapat dua cara untuk mencipta benang dalam Java iaitu mewarisi kelas Benang dan melaksanakan antara muka Runnable. Cara untuk mewarisi kelas Thread adalah seperti berikut: publicclassExampleThreadext
