Örnekte methodA ve methodB, örnek yöntemlerdir (statik yöntemlerin aksine). synchronized
Bir örnek yöntemi koymak , iş parçacığının o yöntemdeki herhangi bir kodu yürütmeye başlayabilmesi için, yöntemin çağrıldığı nesne örneği üzerindeki iş parçacığının kilidini ("iç kilit") alması gerektiği anlamına gelir.
Eşitlenmiş olarak işaretlenmiş iki farklı örnek yönteminiz varsa ve farklı iş parçacıkları aynı yöntemleri aynı anda çağırıyorsa, bu iş parçacıkları aynı kilit için yarışacaktır. Bir iş parçacığı kilidi aldığında, diğer tüm iş parçacıkları o nesnedeki tüm senkronize edilmiş örnek yöntemlerinden kapatılır.
İki yöntemin aynı anda çalışması için farklı kilitler kullanmaları gerekir, örneğin:
class A {
private final Object lockA = new Object();
private final Object lockB = new Object();
public void methodA() {
synchronized(lockA) {
//method A
}
}
public void methodB() {
synchronized(lockB) {
//method B
}
}
}
burada senkronize blok sözdizimi, bloğa girmek için yürütme iş parçacığının kendinden kilit alması gereken belirli bir nesnenin belirlenmesine izin verir.
Anlaşılması gereken önemli şey, bireysel yöntemlere "senkronize" bir anahtar kelime koymamıza rağmen, temel kavramın perde arkasındaki yapısal kilit olmasıdır.
Java öğreticisinin ilişkiyi nasıl tanımladığı aşağıda açıklanmıştır:
Senkronizasyon, kendinden kilitli veya monitör kilidi olarak bilinen bir iç varlık etrafında oluşturulur. (API spesifikasyonu genellikle bu varlığı basitçe bir "monitör" olarak ifade eder.) İçsel kilitler senkronizasyonun her iki yönünde de rol oynar: bir nesnenin durumuna özel erişim sağlamak ve görünürlük için gerekli olan ilişkiden önce ilişkiler kurmak.
Her nesnenin kendisiyle ilişkilendirilmiş kendinden kilit vardır. Kural olarak, bir nesnenin alanlarına özel ve tutarlı erişime ihtiyaç duyan bir iş parçacığının, nesneye erişmeden önce kendinden kilit alması ve daha sonra kendisiyle tamamlandığında iç kilidi açması gerekir. Bir ipliğin, kilidi edindiği ve kilidi serbest bıraktığı zaman arasında içsel kilide sahip olduğu söylenir. Bir iş parçacığının kendinden kilitlemesine sahip olduğu sürece, başka hiçbir iş parçacığı aynı kilidi alamaz. Diğer iş parçacığı, kilidi almaya çalıştığında engellenir.
Kilitlemenin amacı paylaşılan verileri korumaktır. Yalnızca her bir kilit farklı veri üyelerini koruduysa, yukarıdaki örnek kodda gösterildiği gibi ayrı kilitler kullanırsınız.