Синхронизатсия ба чанд ришта дахл дорад. Блоки ҳамоҳангшудаи code метавонад дар як вақт танҳо аз ҷониби як ришта иҷро карда шавад. Java риштаҳои сершуморро барои иҷро дастгирӣ мекунад. Ин метавонад боиси он гардад, ки ду ё зиёда риштаҳо ба як майдон ё an object дастрасӣ пайдо кунанд. Синхронизатсия равандест, ки ба ҳама риштаҳои параллелӣ дар барнома имкон медиҳад, ки синхронӣ кор кунанд. Синхронизатсия аз хатогиҳои мутобиқати хотира, ки дар натиҷаи дастрасии номувофиқ ба хотираи муштарак ба вуҷуд омадааст, пешгирӣ мекунад. Вақте ки усул ҳамчун ҳамоҳангшуда эълон карда мешавад, ришта мониторро барои an objectе нигоҳ медорад, ки методаш иҷро мешавад. Агар риштаи дигар усули ҳамоҳангшударо иҷро кунад, риштаи шумо то он даме, ки риштаи дигар мониторро озод кунад, баста мешавад. Синхронизатсия дар Java бо истифода аз калимаи ҳифзшуда ба даст оварда мешавад
synchronized
. Шумо метавонед онро дар синфҳои худ тавассути муайян кардани усулҳо ё блокҳои ҳамоҳангшуда истифода баред. Шумо наметавонед synchronized
дар тағирёбандаҳо ё атрибутҳо дар таърифи синф истифода баред.
Қулфбандии сатҳи an object
Ин як механизми ҳамоҳангсозии усули ғайристатикӣ ё блоки ғайристатикии code мебошад, ки танҳо як ришта метавонад блок ё усули додашударо дар мисоли додаи синф иҷро кунад. Ин бояд ҳар вақт анҷом дода шавад, ки ба шумо лозим аст, ки риштаи маълумотро дар сатҳи мисол бехатар созед. Мисол:public class DemoClass{
public synchronized void demoMethod(){}
}
ё
public class DemoClass{
public void demoMethod(){
synchronized (this) {
//other thread safe code
}
}
}
ё
public class DemoClass{
private final Object lock = new Object();
public void demoMethod(){
synchronized (lock) {
//other thread safe code
}
}
}
Қулф дар сатҳи синф
Аз ворид шудани риштаҳои сершумор ба блоки ҳамоҳангшуда ҳангоми иҷро дар ҳама гуна ҳолатҳои дастраси синф пешгирӣ мекунад. Ин маънои онро дорад, ки агар ҳангоми иҷрои барнома 100 мисоли синф мавҷуд бошадDemoClass
, дар он вақт танҳо як ришта метавонад demoMethod()
дар ҳама гуна ҳолатҳо иҷро шавад ва ҳамаи ҳолатҳои дигар барои риштаҳои дигар баста мешаванд. Ин вақте лозим аст, ки ба шумо лозим аст, ки риштаи додаҳои статикиро бехатар созед.
public class DemoClass{
public synchronized static void demoMethod(){}
}
ё
public class DemoClass{
public void demoMethod(){
synchronized (DemoClass.class) {
//other thread safe code
}
}
}
ё
public class DemoClass
{
private final static Object lock = new Object();
public void demoMethod(){
synchronized (lock) {
//other thread safe code
}
}
}
Баъзе ёддоштҳои муҳим
- Синхронизатсия дар Java кафолат медиҳад, ки ҳеҷ ду ришта усули ҳамоҳангшударо дар як вақт ё параллел иҷро карда наметавонанд.
synchronized
метавонад танҳо бо усулҳо ва блокҳои code истифода шавад. Ин усулҳо ё блокҳо метавонанд статикӣ ё ғайристатикӣ бошанд.- когда Howой либо поток входит в синхронизированный метод or блок он приобретает блокировку и всякий раз, когда поток выходит из синхронизированного метода or блока JVM снимает блокировку. Блокировка снимается, даже если нить оставляет синхронизированный метод после завершения из-за Howих-либо ошибок or исключений.
synchronized
в Java рентерабельна это означает, что если синхронизированный метод вызывает другой синхронизированный метод, который требует такой же замок, то текущий поток, который держит замок может войти в этот метод не приобретая замок.- Синхронизация в 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