مشخصات مقاله
-
1311
-
0.0
-
4659
-
0
-
0
آموزش 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