Java da 2 farklı senkronizasyon yöntemi vardır.Bunlar:
1- synchronized method : Bu da kendi içinde static-non static metod olarak ikiye ayrılır.Non static metodlar lock objesi olarak instance objesini tutarlar.Staticler ise class objesini lock olarak kullanır.
public synchronized void method(){
...
}
...
}
public synchronized static void method(){
...
}
...
}
2- synchronized block: Özel belirli bir lock objesi tutan statement lardır.
public void method(){
synchronized (obj){
....
}
}
synchronized (obj){
....
}
}
synchronized metodlar scope olarak bloklara göre daha geniştir.Bütün objeyi kilitlerler.Örneğin aşağıdaki kod parçasını incelersek:
public synchronized void method(){
...
}
...
}
metod burda kilit olarak instance objesini kullanır,ve aşağıdaki kodla hemen hemen aynıdır:
public void method(){
synchronized (this){
....
}
}
synchronized (this){
....
}
}
burda metod yerine blok kullanılmış,kilit objesi ise "this" anahtar sözcüğü ile objenin instance'i seçilmiştir.
Bu kullanımın bazı sakıncaları vardır,şöyleki;
eğer biz synchronized metod kullanırsak,kilit olarak objenin instance'ını seçmiş olacağız, bu da farklı bir threadin objenin diğer metodlarına erişmesini engelleyecek ve böylece istenmeyen bir durum ortaya çıkabilecek,bu durumda örnek vermek gerekirse,
Bir classın mesaj üreten bir write metodu ve bu mesajların okunabilmesi için read metodu olsun,burda write metodunu tamamen synchronized edersek,bir thread write metodu içindeyken başka bir thread read metodunun içine giremez,diğer threadin write metodundaki işini bitirmesini beklemek zorundadır ve bu da hoş olmayan bir durumdur.Bu durumdan kurtulmanın en iyi yolu farklı 2 kilit objesi oluşturup synchronized block kullanmak.
public class Mesaj{
public synchronized void write(String msg){
...
}
public synchronized void read(){
...
}
}
public synchronized void write(String msg){
...
}
public synchronized void read(){
...
}
}
bunun yerine :
public class Mesaj{
private Object writeLock = new Object();
private Object readLock = new Object();
private Object writeLock = new Object();
private Object readLock = new Object();
public void write(){
synchronized(writeLock){
....
}
}
public void read(){
synchronized(readLock){
....
}
}
}
synchronized(writeLock){
....
}
}
public void read(){
synchronized(readLock){
....
}
}
}
Bu ayrıntıya dikkat çekmek istedim,umarım faydalı olmuştur.
Diğer yazılarda görüşmek üzere...
Hiç yorum yok:
Yorum Gönder