Java'da notify () yöntemi ile notifyAll () yöntemi arasındaki fark?

Java'da notify () yöntemi ile notifyAll () yöntemi arasındaki fark?

Java'da, notify() ve notifyAll() metodları, bekleyen diğer iş parçacıklarına bir nesne üzerinde değişiklik yapıldığını bildirmek için kullanılır. Ancak, bu iki yöntem arasında bazı farklar vardır.

notify() yöntemi, bir nesne üzerinde sadece bir iş parçacığını uyandırır. Eğer bir nesne üzerinde birden fazla iş parçacığı bekliyorsa, sadece bir tanesi uyanır. Hangi iş parçacığının uyandırılacağı belirli değildir ve JVM tarafından kontrol edilir. notify() yöntemi, nesnenin kilidini serbest bırakmaz, bu nedenle başka bir iş parçacığına erişim izni vermez.

notifyAll() yöntemi ise, bir nesne üzerinde bekleyen tüm iş parçacıklarını uyandırır. Bu nedenle, notifyAll() yöntemi daha fazla iş parçacığına erişim izni verir. notifyAll() yöntemi, nesnenin kilidini serbest bırakmaz, ancak tüm iş parçacıklarının uyanması beklenir.

Örneğin, bir arabellek kullanarak veri üreticisi ve tüketicisi arasındaki senkronizasyonu ele alalım. Veri üreticisi, arabelleğe veri yazarken arabelleği doldurur ve notifyAll() yöntemini çağırır. Bu, tüm tüketici iş parçacıklarının arabellekteki verileri kontrol etmeleri için uyandırılırlar. Tüketici iş parçacıkları, arabelleğin dolu olup olmadığını kontrol ederler ve arabellek doluysa, veriyi okur ve arabelleği boşaltır. Ardından, notifyAll() yöntemini çağırarak, üretici iş parçacığının arabelleğe yeni veri yazmasını sağlarlar.


 

java


 

public class Buffer { private List<Integer> data = new ArrayList<>(); private int capacity = 10; public synchronized void produce(int value) { while (data.size() == capacity) { try { wait(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); return; } } data.add(value); notifyAll(); } public synchronized int consume() { while (data.size() == 0) { try { wait(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); return -1; } } int value = data.remove(0); notifyAll(); return value; } }

Bu örnekte, produce() yöntemi, arabellek dolu olduğunda wait() yöntemini çağırır ve nesnenin kilidini serbest bırakır. consume() yöntemi de arabellek boş olduğunda wait() yöntemini çağırır ve nesnenin kilidini serbest bırakır. Her iki yöntem de işlerini bitirdikten sonra notifyAll() yöntemini çağırır ve nesnenin kilidini serbest bırakır. consume() yöntemi de arabellek boş olduğunda wait() yöntemini çağırır ve nesnenin kilidini serbest bırakır. Her iki yöntem de işlerini bitirdikten sonra notifyAll() yöntemini çağırarak, diğer iş parçacıklarını uyandırırlar.

Bu örnekte, notifyAll() yöntemi kullanıldığı için, arabellekte bekleyen tüm iş parçacıkları uyandırılır ve veri üreticisi iş parçacığı arabelleğe yeni veri yazabilir. Bu sayede, veri tüketici iş parçacıkları tekrar arabellekteki verileri kontrol edebilirler.

Özetle, notify() yöntemi sadece bir iş parçacığını uyandırırken, notifyAll() yöntemi tüm iş parçacıklarını uyandırır. Ancak, notifyAll() yöntemi gereksiz yere tüm iş parçacıklarını uyandırdığı için performans açısından daha kötü olabilir. Bu nedenle, hangi yöntemin kullanılacağı, senkronizasyon gereksinimlerine bağlı olarak değişebilir.

Java'da notify () yöntemi ile notifyAll () yöntemi arasındaki fark?
Paylaş: