کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

آموزش Java – قطعه کد synchronized در Java (multithreading)

آموزش Java – قطعه کد synchronized در Java (multithreading)

قطعه کد Synchronized را می توان برای پیاده سازی synchronization و مدیریت دسترسی thread ها به منابع بر روی متد مورد نظر اعمال کرد. در واقع synchronized یک قطعه کد متشکل از دستوراتی است که که thread ها در آن اشتراک دارند.

فرض کنید 50 خط کد در بدنه ی متد خود دارید اما مایلید تنها 5 خط آن را synchronized نمایید. برای این منظور، این 5 خط کد که احتمالا بین دو یا چند thread مشترک هست را داخل synchronized قرار می دهیم.

اگر تمامی دستورات متد را داخل بدنه ی synchronized قرار دهید آنگاه عملکردی مشابه متد synchronized خواهد داشت.

نکاتی که باید در خصوص استفاده از قطعه کد synchronized بخاطر داشته باشید:

  • قطعه کد synchronized بر روی آبجکت یا منبعی که ممکن است همزمان توسط چند متد مورد دسترسی قرار گیرد، قفل (lock) اعمال می کند.
  • حوزه ی دسترسی (scope) قطعه کد synchronized محدودتر از متد است.

دستور استفاده از قطعه کد synchronized

synchronized (object reference expression) {   
//code block   
}  

مثال کاربردی:

class Table{  
void printTable(int n){  
synchronized(this){//synchronized block  
for(int i=1;i<=5;i++){  
System.out.println(n*i);  
try{  
Thread.sleep(400);  
}catch(Exception e){System.out.println(e);}  
}  
}  
}//end of the method  
}  
class MyThread1 extends Thread{  
Table t;  
MyThread1(Table t){  
this.t=t;  
}  
public void run(){  
t.printTable(5);  
}  
}  
class MyThread2 extends Thread{  
Table t;  
MyThread2(Table t){  
this.t=t;  
}  
public void run(){  
t.printTable(100);  
}  
}  
public class TestSynchronizedBlock1{  
public static void main(String args[]){  
Table obj = new Table();//only one object  
MyThread1 t1=new MyThread1(obj);  
MyThread2 t2=new MyThread2(obj);  
t1.start();  
t2.start();  
}  
}  

خروجی:

5
10
15
20
25
100
300
400
500

در زیر همان مثال را مشاهده می کنید که با کدنویسی کمتر و بهره گیری از قابلیت anonymous class نوشته شده است:

//Program of synchronized block by using annonymous class
class Table{  
void printTable(int n){  
   synchronized(this){//synchronized block  
     for(int i=1;i<=5;i++){  
      System.out.println(n*i);  
      try{  
       Thread.sleep(400);  
      }catch(Exception e){System.out.println(e);}  
     }  
   }  
}//end of the method  
}  
public class TestSynchronizedBlock2{  
public static void main(String args[]){  
final Table obj = new Table();//only one object  
Thread t1=new Thread(){  
public void run(){  
obj.printTable(5);  
}  
};  
Thread t2=new Thread(){  
public void run(){  
obj.printTable(100);  
}  
};  
t1.start();  
t2.start();  
}  
}  

خروجی:

5
10
15
 20
25
100
200
 300
400
500
1396/08/21 4659 1311
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...