Rumah > Soal Jawab > teks badan
一个类的对象锁只有一个,如果有几个非静态函数都是synchronized,在某一时刻只有一个线程能调用其中一个函数
假如一个类有几个静态函数是synchronized,在某一时刻只有一个线程能调用其中一个静态函数吗?也就是类锁也只有一个吗?
巴扎黑2017-04-18 10:51:00
Yang dahulu mengunci objek contoh, mengunci objek semasa Jika terdapat berbilang objek contoh, kaedah synchronized
ini tidak disegerakkan. Jenis kunci kedua ialah objek kelas Terdapat hanya satu objek kelas, jadi ia disegerakkan.
PHP中文网2017-04-18 10:51:00
public class Foo {
synchronized void test1() {
//to implements
}
void test2() {
synchronized(this) {
//to implements
}
}
synchronized static void test3() {
//to implements
}
static void test4() {
synchronized(Foo.class) {
//to implements
}
}
}
Seperti yang ditunjukkan dalam kod di atas, kaedah test1 adalah bersamaan dengan test2 Apabila ini adalah objek yang sama, penyekatan akan berlaku. Sudah tentu, tidak mengapa jika mereka adalah objek yang berbeza, kerana ini berbeza. Dipanggil kunci peringkat objek.
Test3 adalah bersamaan dengan test4 Di sini, objek kelas digunakan sebagai kunci, kerana secara amnya terdapat hanya satu contoh kelas, jadi setiap kali anda memasukkan kaedah ini, ia akan dikunci. Ia dipanggil kunci peringkat kelas.
大家讲道理2017-04-18 10:51:00
Kunci yang digunakan oleh kaedah penyegerakan bukan statik (A) ialah objek tika semasa itu sendiri Selepas A satu tika memperoleh kunci, A tika yang lain mesti menunggu untuk kunci itu dilepaskan contoh menggunakan kunci yang berbeza;
Selain itu, kunci berbeza digunakan antara A dan B, jadi tiada persaingan;
ringa_lee2017-04-18 10:51:00
Class
Kelas mencipta objek untuk mewakili kelas biasa Pada masa ini, "kunci kelas" ialah kunci pada objek contoh ini
伊谢尔伦2017-04-18 10:51:00
Anda bercakap tentang konsep "mutex lock". Terdapat dua situasi untuk kaedah pengubahsuaian yang disegerakkan:
【Kaedah bukan statik】
Apabila kaedah diubah suai dengan disegerakkan, objek kunci ialah objek yang dimiliki oleh kaedah semasa, iaitu ini dalam kaedah.
【Kaedah statik】
Apabila kaedah statik diubah suai dengan disegerakkan, objek yang dikunci oleh kaedah statik ialah objek kelas semasa (contoh kelas Kelas). Setiap kelas mempunyai objek kelas yang unik. Cara mendapatkan objek kelas: classname.class.
Untuk senario yang saling eksklusif, dua perkara perlu difahami:
1. Kaedah statik dan kaedah bukan statik diisytiharkan disegerakkan pada masa yang sama, dan terdapat hubungan yang tidak saling eksklusif antara mereka. Sebabnya ialah kaedah statik mengunci objek kelas dan bukannya objek yang dimiliki oleh kaedah semasa.
2. Apabila Disegerakkan mengubah suai dua keping kod yang berbeza, tetapi objek kunci adalah sama, kedua-dua utas adalah saling eksklusif apabila mereka memanggil dua keping kod masing-masing
Jadi apabila anda menyebut "hanya satu utas boleh memanggil salah satu fungsi pada satu masa" (iaitu pengecualian bersama), syarat penghakiman ialah sama ada objek kunci adalah sama, tanpa mengira jenis kaedah.
伊谢尔伦2017-04-18 10:51:00
Untuk pengubahsuaian disegerakkan kaedah objek, kunci ialah objek itu sendiri, iaitu ini
Untuk pengubahsuaian disegerakkan kaedah statik, kunci ialah objek Kelas itu sendiri, iaitu objek kelas yang dicipta oleh pemuat kelas;