+2 امتیاز
قبل در برنامه نویسی توسط (778 امتیاز)
ویرایش شده قبل توسط
کلمه کلیدی synchronized در جاوا یعنی چی؟

2 پاسخ

+3 امتیاز
قبل توسط (302 امتیاز)
ویرایش شده قبل توسط

کلمه کلیدی Synchronized در جاوا، از دسترسی همزمان چند thread به قسمتی از کد جلوگیری میکنه.

به طور کل این کلمه وقتی به کار میره چند thread مختلف اجازه خواندن و نوشتن بر روی یک متغیر، شی و یا منبعی رو داشته باشند.

این هم نقل قولی از Oracle: متدها یا بلاک های Synchronized از یک استراتژی از ساده برای جلوگیری از تداخل thread ها و بوجود آمدن خطا هنگام ثبت اطلاعات در حافظه استفاده می کنند، در نتیجه اگر یک شی قابل رویت توسط چندین thread باشه، تمامی عملیات های مربوط به خواندن و نوشتن بر روی متغیرهای آن شی میبایست درون متد یا بلاک Synchronized باشد.

+1 امتیاز
قبل توسط (1.1هزار امتیاز)

در جاوا یک تکه از کد و یا یک متد می توانند برای جلوگیری از مشکل 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 می تواند با این شئ مونیتور کار کند.

سوالات مشابه

+1 امتیاز
1 پاسخ 825 بازدید
+1 امتیاز
3 پاسخ 3.9هزار بازدید
0 امتیاز
0 پاسخ 311 بازدید
0 امتیاز
2 پاسخ 749 بازدید
+1 امتیاز
2 پاسخ 253 بازدید
سوال شده 2 سال قبل در برنامه نویسی توسط masoud shahhosseini_ (45 امتیاز)
+1 امتیاز
1 پاسخ 744 بازدید
+2 امتیاز
2 پاسخ 1.3هزار بازدید
...