Çoklu-iş parçacıklı programlarda, bir kaynağı birden fazla iş parçacığı paylaşabilir. Bu gibi durumlarda, beklenmeyen sonuçları önlemek için kaynağa farklı iş parçacıkları tarafından erişim
es zamanlı olmalıdır. Bu amaçla Java bazı metotların ve kod bloklarının kritik olarak işaretlenmesine olanak verir. Örneğin, sadece bir iş parçacığının paylaşılan bir
bir kaynağı kritik bölümleri yürütürken kullanması gibi.
Java da her nesne ayni anda tek bir iş parçacığı ile kontrol edilebilen bir kilide sahiptir. Yani, eğer bir iş parçacığı bir nesnenin kilidini isterse,
ayni kilidi isteyen diğer iş parçacıkları kilit bırakılana kadar bekleyeceklerdir. Bir nesnenin kilidi üç farklı şekilde istenebilir:
-
Bir sınıfın bir metodu synchronized olarak işaretlenebilir. Bu durumda metodun gövdesi tamamen kritik bolum olur.
Bu metodu yürüten iş parçacıkları, metodu bildiren sınıfın bir örneği olan nesnenin kilidini istemek zorundadırlar. Metot döndürüldüğünde kilit bırakılır.
Aşağıdaki örnekte, ayni MyClass örneği için, sadece bir iş parçacığı myMethod1()u veya myMethod2() u yürütebilir:
class MyClass{
public synchronized void myMethod1(){
...
}
public synchronized void myMethod2(){
...
}
...
}
-
Bir metodun içindeki bir kod parçacığı synchronized olarak işaretlenebilir. Bu durumda, kapalı blok içindeki ifadeler
kritik bolum olacaktır. Bu metodu yürüten iş parçacıkları, metodu bildiren sınıfın bir örneği olan nesnenin kilidini istemek zorundadırlar. Blok
yürütüldükten sonra kilit bırakılır.
Aşağıdaki örnekte, ayni MyClass örneği için, sadece bir iş parçacığı myMethod1()u veya
myMethod2() u yürütebilir:
class MyClass{
public synchronized void myMethod1(){
...
}
public void myMethod2(){
...
synchronized (this) {
// synchronized block
...
}
}
...
}
-
Bir metodun içindeki bir kod parçacığı başka bir sınıfın örneği kullanılarak synchronized olarak işaretlenebilir.
Bu durumda, kapalı blok içindeki ifadeler ilgili nesne için
kritik bolum olacaktır. Bu bloğu yürüten iş parçacıkları, belirtilen nesnenin kilidini istemek zorundadırlar. Blok
yürütüldükten sonra kilit bırakılır.
Aşağıdaki örnekte, ayni MyClass örneği x için, sadece bir iş parçacığı myMethod1()u veya
myMethod2() içindeki işaretlenmiş bloğu yürütebilir:
class MyClass{
public synchronized void myMethod1(){
...
}
...
}
class OtherClass{
public void myMethod2(MyClass x){
...
synchronized (x){
// synchronized block
...
}
}
...
}