Senkronize edilmeyen ve örnek değişkenlerine erişip değiştiren bazı yöntemleriniz varsa. Örneğinizde:
private int a;
private int b;
diğer nesneler aynı nesnenin senkronize yöntemindeyken ve örnek değişkenlerinde değişiklik yapabildiğinde, herhangi bir sayıda evre bu senkronize olmayan yöntemlere aynı anda erişebilir. Örneğin: -
public void changeState() {
a++;
b++;
}
Senkronize olmayan yöntemlerin örnek değişkenlerine eriştiği ve değiştirdiği senaryosundan kaçınmanız gerekir, aksi takdirde senkronize edilmiş yöntemleri kullanmanın bir anlamı yoktur.
Aşağıdaki senaryoda: -
class X {
private int a;
private int b;
public synchronized void addA(){
a++;
}
public synchronized void addB(){
b++;
}
public void changeState() {
a++;
b++;
}
}
İş parçacıklarından yalnızca biri addA veya addB yönteminde olabilir, ancak aynı zamanda herhangi bir iş parçacığı changeState yöntemine girebilir. İki iş parçacığı aynı anda addA ve addB giremez (Nesne düzeyi kilitleme nedeniyle), ancak aynı zamanda herhangi bir iş parçacığı changeState girebilir.
synchronized (this)
gövdesi etrafında bir bloğa sahip olmakla eşdeğerdir . "This" nesnesi kilitlenmez, bunun yerine "this" nesnesi muteks olarak kullanılır ve gövdenin "this" üzerinde de senkronize edilen diğer kod bölümleriyle eşzamanlı olarak yürütülmesi engellenir. Senkronize olmayan diğer "this" alanlarını / yöntemlerini etkilemez.