Sinhronizasiýa köp okalmagy aňladýar. Sinhronlaşdyrylan kod bloky diňe bir sapak bilen ýerine ýetirilip bilner. Java ýerine ýetirmek üçin birnäçe sapaklary goldaýar. Bu iki ýa-da has köp sapagyň şol bir meýdana ýa-da obýekte girmegine sebäp bolup biler. Sinhronizasiýa, programmadaky ähli parallel sapaklaryň sinhron işlemegine mümkinçilik berýän prosesdir. Sinhronizasiýa, umumy ýadyň gabat gelmezligi sebäpli ýüze çykýan ýadyň yzygiderliliginden gaça durýar. Haçan-da bir usul sinhronlaşdyrylan diýlip yglan edilende, sapak ýerine ýetirilýän obýekt üçin monitor saklaýar. Başga bir sapak sinhronlaşdyrylan usuly ýerine ýetirýän bolsa, beýleki sapak monitory goýberýänçä, sapagyňyz petiklener. Sinhronizasiýa Java-da ätiýaçlandyrylan söz ulanyp gazanylýar
synchronized
. Sinhronlaşdyrylan usullary ýa-da bloklary kesgitläp, sapaklaryňyzda ulanyp bilersiňiz. synchronized
Synp kesgitlemesinde üýtgeýänlerde ýa-da atributlarda ulanyp bilmersiňiz .
Obýekt derejesindäki gulplama
Bu, statik däl usuly ýa-da statik däl kod blokyny sinhronlamak üçin bir mehanizm, synpyň belli bir mysalynda diňe bir sapak berlen blok ýa-da usuly ýerine ýetirip biler. Mysal derejesindäki maglumat sapagyny ygtybarly etmek zerur bolanda bu edilmelidir. Mysal:public class DemoClass{
public synchronized void demoMethod(){}
}
ýa-da
public class DemoClass{
public void demoMethod(){
synchronized (this) {
//other thread safe code
}
}
}
ýa-da
public class DemoClass{
private final Object lock = new Object();
public void demoMethod(){
synchronized (lock) {
//other thread safe code
}
}
}
Klassiki derejeli gulplama
Synpyň bar bolan ýagdaýlarynda ýerine ýetirilende birnäçe sapaklaryň sinhron bloklara girmeginiň öňüni alýar. Diýmek, programma ýerine ýetirilende synpyň 100 mysaly bar bolsaDemoClass
, şol döwürde diňe bir sapak islendik ýagdaýda ýerine ýetirip biler demoMethod()
we beýleki ähli ýagdaýlar beýleki sapaklar üçin petiklener. Statiki maglumatlar sapagyny ygtybarly etmek zerur bolsa.
public class DemoClass{
public synchronized static void demoMethod(){}
}
ýa-da
public class DemoClass{
public void demoMethod(){
synchronized (DemoClass.class) {
//other thread safe code
}
}
}
ýa-da
public class DemoClass
{
private final static Object lock = new Object();
public void demoMethod(){
synchronized (lock) {
//other thread safe code
}
}
}
Käbir möhüm bellikler
- Java-da sinhronizasiýa, iki sapagyň bir wagtda ýa-da paralel sinhronlaşdyrylan usuly ýerine ýetirip bilmejekdigini üpjün edýär.
synchronized
diňe usullar we kod bloklary bilen ulanylyp bilner. Bu usullar ýa-da bloklar statik ýa-da statik däl bolup biler.- Haçan-da haýsydyr bir sapak sinhronlaşdyrylan usula gireninde ýa-da blokirläninde gulp alýar we haçan-da bir sapak sinhronlaşdyrylan usuldan çyksa ýa-da JVM blokirlese gulpy boşadýar. Haýsydyr bir ýalňyşlyk ýa-da kadadan çykma sebäpli sapak gutarandan soň sinhronlaşdyrylan usuldan çyksa-da gulp boşadylýar.
synchronized
Java-da , bu sinhronlaşdyrylan usul şol bir gulpy talap edýän başga bir sinhronlaşdyrylan usuly çagyrsa, gulpy saklaýan häzirki sapak gulpy almazdan şol usula girip biljekdigini aňladýar.- Синхронизация в 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