در جاوا یک تکه از کد و یا یک متد می توانند برای جلوگیری از مشکل race condition، با کلمه کلیدی synchronized به حالتی در بیاید که در یک زمان فقط یک thread بتواند آن متد یا تکه کد را اجرا کند.
کلمه کلیدی synchronized در 4 حالت قابل استفاده است:
1- Synchronized Instance Method:
public synchronized void add(int value){
this.count += value;
}
یک synchronized instance method، در سطح اشیاء ساخته شده از کلاس synchronized است، یعنی اگر از این کلاس چند شئ ساخته شود متد add هر شئ بصورت جداگانه synchronized است و وقتی یک thread در حال فراخوانی متد add یکی از اشیاء است، thread دیگر می تواند متد add یک شئ دیگر را فراخوانی کند.
2- Synchronized Static Method:
public static synchronized void add(int value){
count += value;
}
یک synchronized static method، در سطح کلاس synchronized است، یعنی اگر از این کلاس چند شئ نیز ساخته شود متد add برای تمام آن اشیاء synchronized است و وقتی یک thread در حال فراخوانی متد add یکی از اشیاء است، thread دیگر نمی تواند متد add یک شئ دیگر را فراخوانی کند.
3- Synchronized Blocks in Instance Method: وقتی شما نمی خواهید کل یک متد را synchronized کنید از این روش استفاده می کنید و می توانید فقط قسمتی از آن متد را synchronized کنید.
public void add(int value){
synchronized(this){
this.count += value;
}
}
بلاک synchronized در جاوا یک شئ بعنوان مونیتور می گیرد و فقط یک thread می تواند درون بلاک کد synchronized شده برای هر شئ مونیتور اجرا شود.
4- Synchronized Blocks in Static Method:
public static void log2(String msg1, String msg2){
synchronized(MyClass.class){
log.writeln(msg1);
log.writeln(msg2);
}
}
نکته: هر شئی در جاوا یک مونیتور دارد که thread ها می توانند آن را lock و unlock کنند و در آن واحد فقط یک thread می تواند با این شئ مونیتور کار کند.