synchronized 用法总结
synchronized用到不同地方对代码产生的影响:
1. synchronized关键字修饰方法
假设P1、P2是同一个类的不同对象,这个类中定义了以下几种情况的同步块或同步方法,P1、P2就都能够调用他们。
public synchronized void method(){
//
}
这也就是同步方法,那这时synchronized锁定的是调用这个同步方法对象。也就是说,当一个对象P1在不同的线程中执行这个同步方法时,他们之间会形成互斥,达到同步的效果。同时如果该对象中有多个同步方法,则当一个线程获执行对象中的一个synchronized方法,则该对象中其它同步方法也不允许别的线程执行。但是这个对象所属的Class所产生的另一对象P2却能够任意调用这个被加了synchronized关键字的方法。
上边的示例代码等同于如下代码:
public void method() {
synchronized (this)
{
//..
}
}
此次就是一个P1对象的对象锁,哪个拿到了P1对象锁的线程,才能够调用P1的同步方法,而对P2而言,P1这个锁和他毫不相干,程式也可能在这种情形下摆脱同步机制的控制,造成数据混乱。
2.同步块,示例代码如下:
public void method(SomeObject so) {
synchronized(so)
{
//..
}
}
这时,锁就是so这个对象,每个对象对应一个唯一的锁,所以哪个线程拿到这个对象锁谁就能够运行他所控制的那段代码。当有一个明确的对象作为锁时,就能够这样写程式,但当没有明确的对象作为锁,只是想让一段代码同步时,能够创建一个特别的instance变量(他得是个对象)来充当锁:
private byte[] lock = new byte[0];
Public void method(){
synchronized(lock)
{
//
}
}
PS:零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Object lock = new Object()则需要7行操作码。
3.将synchronized作用于static 函数,示例代码如下:
Class Foo
{
public synchronized static void method1()
{
//.
}
public void method2()
{
synchronized(Foo.class)
//
}
}
这两个同步方法都调用这个方法的对象所属的类的类锁(Class,而不再是由这个Class产生的某个具体对象了)。
能够推断:假如一个类中定义了一个synchronized的static函数A,也定义了一个synchronized 的instance函数B,那么这个类的同一对象Obj在多线程中分别访问A和B两个方法时,不会构成同步,因为他们的锁都不相同。A方法的锁是Obj所属的那个Class,而B的锁是Obj所属的这个对象。

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



1. Ciri asas 1. Ia bermula dengan kunci optimistik, dan jika konflik kunci kerap berlaku, ia ditukar kepada kunci pesimis 2. Ia bermula dengan pelaksanaan kunci ringan, dan jika kunci itu dipegang untuk masa yang lama, ia ditukar kepada kunci heavyweight 3. Strategi kunci putaran yang paling mungkin digunakan semasa melaksanakan kunci ringan 4. Ia adalah kunci tidak adil 5. Ia adalah kunci masuk semula 6. Ia bukan kunci baca-tulis 2. JVM akan menyegerakkan proses penguncian Kunci dibahagikan kepada tiada kunci, kunci berat sebelah, kunci ringan dan keadaan kunci berat. Ia akan dinaik taraf secara berurutan mengikut situasi. Kunci berat sebelah menganggap bahawa protagonis lelaki adalah kunci dan protagonis wanita adalah benang Jika hanya benang ini menggunakan kunci ini, maka protagonis lelaki dan protagonis wanita boleh hidup bahagia selama-lamanya walaupun mereka tidak mendapat sijil nikah (mengelakkan tinggi. -operasi kos). Tetapi peranan sokongan wanita muncul

1. Konsep kunci dalam Java Spin lock: Apabila benang memperoleh kunci, jika kunci telah diperoleh oleh benang lain, maka benang akan menunggu dalam satu gelung, dan kemudian terus menilai sama ada kunci itu boleh berjaya diperolehi sehingga ia diperolehi. Kunci akan keluar dari gelung. Penguncian optimistik: Dengan mengandaikan tiada konflik, jika data didapati tidak konsisten dengan data yang diperoleh sebelum ini semasa mengubah suai data, data terkini akan dibaca dan pengubahsuaian akan dicuba semula. Kunci pesimis: Andaikan bahawa konflik serentak akan berlaku, segerakkan semua operasi berkaitan data dan mula mengunci dari masa data dibaca. Kunci eksklusif (tulis): Tambahkan kunci tulis pada sumber Utas boleh mengubah suai sumber, tetapi utas lain tidak boleh menguncinya semula (tulisan tunggal). Kunci kongsi (baca): Selepas menambah kunci baca pada sumber, ia hanya boleh dibaca tetapi tidak diubah suai benang lain hanya boleh menambah kunci baca dan tidak boleh menambah kunci tulis (berbilang). Lihat sebagai S

Ringkasan cara menggunakan disegerakkan dalam Java 1. Apabila disegerakkan digunakan sebagai pengubah suai fungsi, kod sampel adalah seperti berikut: Publicsynchronizedvoidmethod(){//….} Ini ialah kaedah penyegerakan Jadi objek yang manakah disegerakkan pada masa ini? Apa yang dia kunci ialah memanggil objek kaedah disegerakkan ini. Dalam erti kata lain, apabila objek P1 melaksanakan kaedah penyegerakan ini dalam urutan yang berbeza, mereka akan membentuk pengecualian bersama untuk mencapai kesan penyegerakan. Walau bagaimanapun, objek lain P2 yang dijana oleh Kelas yang mempunyai objek ini boleh sewenang-wenangnya memanggil kaedah ini dengan kata kunci yang disegerakkan ditambah. Kod sampel di atas, dsb.

1. Jelaskan bahawa disegerakkan ialah kaedah penyegerakan kami yang paling biasa digunakan, dan terdapat tiga cara utama untuk menggunakannya. 2. Contoh//Penyegerakan kaedah kelas umum synchronizedpublidvoidinvoke(){}//Penyegerakan kaedah statik kelas synchronizedpublicstaticvoidinvoke(){}//Penyegerakan blok kod disegerakkan(objek){}Perbezaan antara ketiga-tiga kaedah ini ialah objek yang disegerakkan adalah berbeza. Kelas biasa menyegerakkan objek itu sendiri, kaedah statik menyegerakkan Kelas itu sendiri, dan blok kod menyegerakkan objek yang kita isi dalam kurungan. Apakah koleksi yang terdapat di Jawa?

Penyediaan alat Sebelum kita bercakap secara rasmi tentang prinsip disegerakkan, mari kita bercakap tentang kunci putaran dahulu, kerana kunci putaran memainkan peranan yang besar dalam pengoptimuman penyegerakan. Untuk memahami kunci putaran, kita perlu memahami apa itu atomicity. Apa yang dipanggil atomicity hanya bermaksud bahawa setiap operasi sama ada tidak dilakukan atau dilakukan. Melakukan semua bermakna ia tidak boleh diganggu semasa operasi Contohnya, untuk menambah satu kepada data pembolehubah, terdapat tiga langkah berikut: tambah data Muatkan daripada ingatan ke dalam daftar. Tambahkan satu pada nilai data. Tulis hasilnya kembali ke ingatan. Atomicity bermaksud bahawa apabila utas menjalankan operasi kenaikan, ia tidak boleh diganggu oleh utas lain Hanya apabila utas ini menyelesaikan ketiga-tiga proses ini

Ringkasan: Kata kunci disegerakkan disediakan dalam Java untuk memastikan hanya satu utas boleh mengakses blok kod disegerakkan. Memandangkan kata kunci disegerakkan telah disediakan, mengapa antara muka Lock juga disediakan dalam pakej Java SDK? Adakah ini penciptaan semula roda yang tidak perlu? Hari ini, kita akan membincangkan isu ini bersama-sama. Kata kunci disegerakkan disediakan dalam Java untuk memastikan bahawa hanya satu utas boleh mengakses blok kod disegerakkan. Memandangkan kata kunci disegerakkan telah disediakan, mengapa antara muka Lock juga disediakan dalam pakej Java SDK? Adakah ini penciptaan semula roda yang tidak perlu? Hari ini, mari kita bincangkan bersama

Apakah yang Disegerakkan? Pembaca Java tidak asing dengan kata kunci yang disegerakkan Ia boleh dilihat dalam pelbagai kod sumber perisian tengah atau kod sumber JDK Bagi pembaca yang tidak biasa dengan disegerakkan, mereka hanya tahu bahawa kata kunci yang disegerakkan perlu digunakan dalam berbilang. -benang disegerakkan boleh memastikan keselamatan benang. Ia dipanggil: kunci mutex (hanya satu utas boleh dilaksanakan pada masa yang sama, utas lain akan menunggu), juga dipanggil: kunci pesimis (hanya satu utas boleh dilaksanakan pada masa yang sama, utas lain akan menunggu). membantu anda melaksanakannya, pembangun hanya perlu menggunakan kata kunci yang disegerakkan. Apabila menggunakannya, anda perlu menggunakan objek sebagai mutex untuk kunci

Java menyediakan beberapa pengubah suai lain untuk menyediakan fungsi di luar penglihatan. Pengubah suai ini dipanggil pengubah bukan akses. Ahli Statik yang diisytiharkan sebagai statik adalah perkara biasa kepada semua keadaan kelas. Ahli statik ialah ahli peringkat kelas yang disimpan dalam ingatan kelas. Akhir Pengubah suai ini digunakan untuk menyekat pengubahsuaian lanjut kepada pembolehubah, kaedah atau kelas. Nilai pembolehubah yang diisytiharkan muktamad tidak boleh diubah suai setelah ia memperoleh nilainya. Kaedah Akhir tidak boleh ditindih dalam subkelas, begitu juga subkelas kelas Akhir tidak boleh dibuat. Abstrak Pengubah suai ini boleh digunakan dengan kelas atau kaedah. Anda tidak boleh menggunakan pengubah suai ini pada pembolehubah dan pembina. Kaedah yang diisytiharkan abstrak mesti diubah suai dalam subkelas. Anda tidak boleh membuat instantiate kelas yang diisytiharkan abstrak. Synchronous Pengubah suai ini digunakan untuk mengawal berbilang benang
