synchronized
می خواهیم «کلیدواژه synchronized در جاوا» را ساده ببینیم. «کلیدواژه (Keyword)» یعنی واژه ای که به کامپایلر فرمان می دهد. synchronized یعنی «هماهنگ سازی». بنابراین فقط یک نخ (Thread) هم زمان وارد متد می شود.
synchronized چیست و کجا به کار می رود؟
طبق منبع، synchronized یک «تغییردهنده (Modifier)» برای قفل کردن متد است. بنابراین هر بار فقط یک نخ از آن عبور می کند. این کار جلوی «شرایط مسابقه ای (Race Condition)» را می گیرد و مقادیر وسط کار خراب نمی شوند.
نمونه کد: جلوگیری از Race Condition با synchronized
در این مثال، انتقال وجه بین a و b با متد synchronized انجام می شود تا مجموع ثابت بماند.
public class Main implements Runnable {
public static int a;
public static int b;
public static void main(String[] args) {
a = 100;
b = 100;
System.out.println("Total before: " + (a + b));
Thread thread1 = new Thread(new Main());
Thread thread2 = new Thread(new Main());
thread1.start();
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Total after: " + (a + b));
}
public void run() {
for (int i = 0; i < 10000000; i++) {
transfer();
}
}
public static synchronized void transfer() {
int amount = (int) (5.0 * Math.random());
if (a > b) {
a -= amount;
b += amount;
} else {
a += amount;
b -= amount;
}
}
}
تعریف و کاربرد synchronized
synchronized متد را قفل می کند تا یک نخ وارد شود. اگر این قفل را برداری، نخ دیگر وسط کار مقادیر a و b را عوض می کند. بنابراین مجموع تغییر می کند و نتیجه خراب می شود.
تمرین مرحله ای
- کلاس را بساز و a و b را مقداردهی کن.
- دو نخ بساز و آن ها را start کن.
- روی متد transfer کلمه synchronized بگذار.
- اجرا کن و مجموع قبل و بعد را مقایسه کن.
- synchronized را بردار و تفاوت خروجی را ببین.
نکته: synchronized روی متد یعنی ورود تک نخی. بنابراین بخش بحرانی امن می شود.
کلیدواژه synchronized را به عنوان مرجع سریع نگه دار.
مُدیفایرها در جاوا را ببین تا نقش synchronized روشن تر شود.
نخ ها (Threads) در جاوا را مرور کن تا موضوع قفل بهتر جا بیفتد.
جمع بندی سریع
- synchronized یعنی قفل روی متد.
- هر لحظه یک نخ وارد می شود.
- Race Condition را کم می کند.
- نتیجه محاسبات پایدار می ماند.