5 Kasım 2019 Salı

synchronized Anahtar Kelimesi

Giriş
Şu şekillerde kullanılabilir.

1. Metod Seviyesi
2. Static Method Seviyesi
3. Kod Bloğu Seviyesi

synchronized yerine ReentrantLock kullanılabilir.

Dikkat
Açıklaması şöyle. Yani 1 ve 2. kullanımda bir thread synchronized A() metoduna girerse, bir başka thread synchronized B() metoduna giremez!
When we use a synchronized block, internally Java uses a monitor also known as monitor lock or intrinsic lock, to provide synchronization. These monitors are bound to an object, thus all synchronized blocks of the same object can have only one thread executing them at the same time.
synchronized Kilit Reentrant Özelliğe Sahiptir
Açıklaması şöyle. Yani aynı thread synchronized metodu recursive şekilde çağırabilir.
Synchronized blocks in Java are reentrant. This means, that if a Java thread enters a synchronized block of code, and thereby take the lock on the monitor object the block is synchronized on, the thread can enter other Java code blocks synchronized on the same monitor object.
1. Metod Seviyesi
Açıklaması şöyle.
synchronized methods enable a simple strategy for preventing thread interference and memory consistency errors: if an object is visible to more than one thread, all reads or writes to that object's variables are done through synchronized methods.
synchronized(this) olarak düşünülebilir.

Örnek
Elimizde şöyle bir kod olsun.
class A {
  public synchronized void methodA() {
    // all function code
  }
}
Şöyle düşünülebilir.
class A {
  public void methodA() {
    synchronized(this) {
      // all function code
    }
  } 
}
2. Static Metod Seviyesi
synchronized(Foo.class) olarak düşünülebilir.
Örnek
Elimizde şöyle bir kod olsun.
class A {
  public static synchronized void methodA() {
    // all function code
  }
}
Şöyle düşünülebilir.
class A {
  public void methodA() {
    synchronized(A.class) {
      // all function code
    }
  } 
}
3. Kod Bloğu Seviyesi
Örnek
Şöyle yaparız
class A {
  private Object lock1 = new Object();

  public void methodA() {
    synchronized(lock1 ) {
      // all function code
    }
  } 
}

Hiç yorum yok:

Yorum Gönder