همگام سازی به چند رشته ای اشاره دارد. یک بلوک همگام شده از کد را فقط می توان توسط یک رشته در یک زمان اجرا کرد. جاوا از چندین رشته برای اجرا پشتیبانی می کند. این می تواند منجر به دسترسی دو یا چند رشته به یک فیلد یا شیء مشابه شود. همگام سازی فرآیندی است که به تمام رشته های موازی در یک برنامه اجازه می دهد تا به صورت همزمان اجرا شوند. همگام سازی از خطاهای ثبات حافظه ناشی از دسترسی ناسازگار به حافظه مشترک جلوگیری می کند. هنگامی که یک روش به عنوان همگام اعلام می شود، رشته یک مانیتور برای شی ای که متد آن اجرا می شود نگه می دارد. اگر رشته دیگری در حال اجرای یک روش همگامسازی باشد، رشته شما مسدود میشود تا زمانی که رشته دیگر مانیتور را آزاد کند. همگام سازی در جاوا با استفاده از یک کلمه رزرو شده به دست می آید
synchronized
. می توانید با تعریف متدها یا بلوک های همگام شده از آن در کلاس های خود استفاده کنید. شما نمی توانید synchronized
از متغیرها یا ویژگی ها در تعریف کلاس استفاده کنید.
قفل کردن در سطح شی
این مکانیزمی است برای همگام سازی یک متد غیر ایستا یا بلوک غیر ایستا کد به طوری که فقط یک رشته می تواند یک بلوک یا متد معین را در یک نمونه معین از یک کلاس اجرا کند. این کار باید هر زمان که نیاز به ایمن کردن رشته داده در سطح نمونه داشته باشید انجام شود. مثال:public class DemoClass{
public synchronized void demoMethod(){}
}
یا
public class DemoClass{
public void demoMethod(){
synchronized (this) {
//other thread safe code
}
}
}
یا
public class DemoClass{
private final Object lock = new Object();
public void demoMethod(){
synchronized (lock) {
//other thread safe code
}
}
}
قفل در سطح کلاس
از ورود چندین رشته به یک بلوک همگامسازی شده در طول اجرا در هر یک از نمونههای موجود کلاس جلوگیری میکند. این به این معنی است که اگر 100 نمونه از کلاس در حین اجرای یک برنامه وجود داشته باشد ، در آن زمان فقط یک رشته در هر یک از مواردDemoClass
می تواند اجرا شود و بقیه موارد برای موضوعات دیگر مسدود می شوند. demoMethod()
این زمانی ضروری است که شما نیاز به ایمن کردن رشته داده استاتیک دارید.
public class DemoClass{
public synchronized static void demoMethod(){}
}
یا
public class DemoClass{
public void demoMethod(){
synchronized (DemoClass.class) {
//other thread safe code
}
}
}
یا
public class DemoClass
{
private final static Object lock = new Object();
public void demoMethod(){
synchronized (lock) {
//other thread safe code
}
}
}
چند نکته مهم
- همگام سازی در جاوا تضمین می کند که هیچ دو رشته ای نمی توانند یک روش همگام سازی شده را همزمان یا به صورت موازی اجرا کنند.
synchronized
فقط با متدها و بلوک های کد قابل استفاده است. این روش ها یا بلوک ها می توانند ایستا یا غیر ایستا باشند.- هرگاه نخی وارد یک متد یا بلاک همگام شود، قفل پیدا می کند و هرگاه نخی از روش همگام یا بلاک خارج شود، JVM قفل را آزاد می کند. قفل آزاد می شود حتی اگر موضوع پس از اتمام به دلیل هر گونه خطا یا استثنا از روش هماهنگ شده خارج شود.
synchronized
در جاوا ، این بدان معناست که اگر یک روش همگامسازی شده، روش همگام دیگری را که به همان قفل نیاز دارد فراخوانی کند، رشته فعلی که قفل را نگه میدارد میتواند بدون دریافت قفل وارد آن روش شود.- Синхронизация в 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