Sinxronizatsiya ko'p ish zarralarini bildiradi. Sinxronlashtirilgan kod bloki bir vaqtning o'zida faqat bitta ip tomonidan bajarilishi mumkin. Java bajarish uchun bir nechta mavzularni qo'llab-quvvatlaydi. Bu bir xil maydon yoki ob'ektga ikki yoki undan ortiq oqim kirishiga olib kelishi mumkin. Sinxronizatsiya - bu dasturdagi barcha parallel oqimlarning sinxron ishlashiga imkon beruvchi jarayon. Sinxronizatsiya umumiy xotiraga nomuvofiq kirish natijasida kelib chiqqan xotira izchilligidagi xatolardan qochadi. Usul sinxronlashtirilgan deb e'lon qilinganda, ip usuli bajarilayotgan ob'ekt uchun monitorni ushlab turadi. Agar boshqa ish zarrachasi sinxronlashtirilgan usulni bajarayotgan bo'lsa, boshqa ip monitorni qo'yib yubormaguncha sizning ipingiz bloklanadi. Sinxronizatsiya Java'da ajratilgan so'z yordamida amalga oshiriladi
synchronized
. Sinxronlashtirilgan usullar yoki bloklarni belgilash orqali uni sinflaringizda ishlatishingiz mumkin. synchronized
Siz sinf taʼrifida oʻzgaruvchilar yoki atributlardan foydalana olmaysiz .
Ob'ekt darajasida qulflash
Bu statik bo'lmagan usulni yoki statik bo'lmagan kod blokini sinxronlashtirish mexanizmi bo'lib, faqat bitta ip ma'lum bir sinf misolida berilgan blok yoki usulni bajarishi mumkin. Buni namunaviy darajadagi ma'lumotlar oqimini xavfsiz qilish kerak bo'lganda qilish kerak. Misol:public class DemoClass{
public synchronized void demoMethod(){}
}
yoki
public class DemoClass{
public void demoMethod(){
synchronized (this) {
//other thread safe code
}
}
}
yoki
public class DemoClass{
private final Object lock = new Object();
public void demoMethod(){
synchronized (lock) {
//other thread safe code
}
}
}
Sinf darajasida qulflash
Sinfning mavjud bo'lgan har qanday misolida bajarilishi davomida sinxronlashtirilgan blokga bir nechta oqimlarning kirishini oldini oladi. Bu shuni anglatadiki, agar dasturni bajarish paytida sinfning 100 ta nusxasi mavjud bo'lsaDemoClass
, u holda har qanday holatda o'sha paytda faqat bitta ip bajara oladi demoMethod()
va qolgan barcha holatlar boshqa oqimlar uchun bloklanadi. Bu statik ma'lumotlar oqimini xavfsiz qilish kerak bo'lganda kerak.
public class DemoClass{
public synchronized static void demoMethod(){}
}
yoki
public class DemoClass{
public void demoMethod(){
synchronized (DemoClass.class) {
//other thread safe code
}
}
}
yoki
public class DemoClass
{
private final static Object lock = new Object();
public void demoMethod(){
synchronized (lock) {
//other thread safe code
}
}
}
Ba'zi muhim eslatmalar
- Java-da sinxronizatsiya ikkita oqim bir vaqtning o'zida yoki parallel ravishda sinxronlashtirilgan usulni bajara olmasligini ta'minlaydi.
synchronized
faqat usullar va kod bloklari bilan ishlatilishi mumkin. Ushbu usullar yoki bloklar statik yoki statik bo'lmagan bo'lishi mumkin.- Har qanday ip sinxronlashtirilgan usul yoki blokga kirsa, u qulfga ega bo'ladi va sinxronlashtirilgan usul yoki blokdan chiqqanda JVM qulfni chiqaradi. Har qanday xatolik yoki istisnolar tufayli ish tugagandan so'ng sinxronlashtirilgan usuldan chiqib ketgan taqdirda ham qulf chiqariladi.
synchronized
Java-da , bu shuni anglatadiki, agar sinxronlashtirilgan usul bir xil qulfni talab qiladigan boshqa sinxronlashtirilgan usulni chaqirsa, qulfni ushlab turgan joriy ip qulfni olmagan holda ushbu usulga kirishi mumkin.- Синхронизация в Java будет бросать
NullPointerException
если an object используемый в синхронизированном блоке null. Например, в вышеприведенном примере codeа, если замок инициализируется Hownull
, синхронизированный (lock) броситNullPointerException
. - Синхронизированные методы в Java вносят дополнительные затраты на производительность вашего applications. Так что используйте синхронизацию, когда она абсолютно необходима. Кроме того, рассмотрите вопрос об использовании синхронизированных блоков codeа для синхронизации только критических секций codeа.
- Вполне возможно, что и статический и не статический синхронизированные методы могут работать одновременно or параллельно, потому что они захватывают замок на другой an object.
- В соответствии со спецификацией языка вы не можете использовать
synchronized
в конструкторе это приведет к ошибке компиляции. - Не синхронизируйте по не финальному (no final) полю, потому что link, на не финальное поле может измениться в любое время, а затем другой поток может получить синхронизацию на разных an objectх и уже не будет ниHowой синхронизации вообще. Лучше всего использовать класс
String
, который уже неизменяемый и финальный.
GO TO FULL VERSION