JavaRush /وبلاگ جاوا /Random-FA /همگام سازی موضوع، قفل کردن شی و قفل کلاس
CynepHy6
مرحله
Великий Новгород

همگام سازی موضوع، قفل کردن شی و قفل کلاس

در گروه منتشر شد
همگام سازی موضوع، قفل کردن شی و قفل کلاس - 1همگام سازی به چند رشته ای اشاره دارد. یک بلوک همگام شده از کد را فقط می توان توسط یک رشته در یک زمان اجرا کرد. جاوا از چندین رشته برای اجرا پشتیبانی می کند. این می تواند منجر به دسترسی دو یا چند رشته به یک فیلد یا شیء مشابه شود. همگام سازی فرآیندی است که به تمام رشته های موازی در یک برنامه اجازه می دهد تا به صورت همزمان اجرا شوند. همگام سازی از خطاهای ثبات حافظه ناشی از دسترسی ناسازگار به حافظه مشترک جلوگیری می کند. هنگامی که یک روش به عنوان همگام اعلام می شود، رشته یک مانیتور برای شی ای که متد آن اجرا می شود نگه می دارد. اگر رشته دیگری در حال اجرای یک روش همگام‌سازی باشد، رشته شما مسدود می‌شود تا زمانی که رشته دیگر مانیتور را آزاد کند. همگام سازی در جاوا با استفاده از یک کلمه رزرو شده به دست می آید 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
        }
    }
}

چند نکته مهم

  1. همگام سازی در جاوا تضمین می کند که هیچ دو رشته ای نمی توانند یک روش همگام سازی شده را همزمان یا به صورت موازی اجرا کنند.

  2. synchronizedفقط با متدها و بلوک های کد قابل استفاده است. این روش ها یا بلوک ها می توانند ایستا یا غیر ایستا باشند.

  3. هرگاه نخی وارد یک متد یا بلاک همگام شود، قفل پیدا می کند و هرگاه نخی از روش همگام یا بلاک خارج شود، JVM قفل را آزاد می کند. قفل آزاد می شود حتی اگر موضوع پس از اتمام به دلیل هر گونه خطا یا استثنا از روش هماهنگ شده خارج شود.

  4. synchronizedدر جاوا ، این بدان معناست که اگر یک روش همگام‌سازی شده، روش همگام دیگری را که به همان قفل نیاز دارد فراخوانی کند، رشته فعلی که قفل را نگه می‌دارد می‌تواند بدون دریافت قفل وارد آن روش شود.

  5. Синхронизация в Java будет бросать NullPointerException если an object используемый в синхронизированном блоке null. Например, в вышеприведенном примере codeа, если замок инициализируется How null, синхронизированный (lock) бросит NullPointerException.

  6. Синхронизированные методы в Java вносят дополнительные затраты на производительность вашего applications. Так что используйте синхронизацию, когда она абсолютно необходима. Кроме того, рассмотрите вопрос об использовании синхронизированных блоков codeа для синхронизации только критических секций codeа.

  7. Вполне возможно, что и статический и не статический синхронизированные методы могут работать одновременно or параллельно, потому что они захватывают замок на другой an object.

  8. В соответствии со спецификацией языка вы не можете использовать synchronized в конструкторе это приведет к ошибке компиляции.

  9. Не синхронизируйте по не финальному (no final) полю, потому что link, на не финальное поле может измениться в любое время, а затем другой поток может получить синхронизацию на разных an objectх и уже не будет ниHowой синхронизации вообще. Лучше всего использовать класс String, который уже неизменяемый и финальный.

Удачи в обучении!! Оригинал: Object level lock vs Class level lock in Java
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION