Kotlin’de thread senkronizasyonu
Selamlar bu makalede Kotlin’de aynı anda çalışan iş parçacıklarının doğru bir şekilde senkronize edilememesi ve ConcurrentModificationException gibi hataları almamızı nasıl engelleyeceğimizi ve veri tutarlılığını nasıl sağlayacağımızı anlatacağım.
Kotlin’de thread senkronizasyonu için birkaç farklı yöntem bulunmaktadır. Bunlardan bazıları CountDownLatch
, Mutex
, CyclicBarrier
ve Semaphore
’dur.
ilk olarak CountDownLatch
sınıfına bakabiliriz, bu sınıf birden fazla thread’in belirli bir işlemi tamamlamasını beklemek için kullanılır. Latch anlam olarak mandal olarak geçer ve aslında thread’leri birbirine mandallamak için kullandığımızı söyleyebiliriz.
val latch = CountDownLatch(2)Thread {
latch.countDown()
}.start()Thread {
latch.countDown()
}.start()latch.await()
// await ile her bir iş tamamlanana kadar askıya alıyor
Bu kod parçacığı, iki thread’i başlatır ve her iki thread’in de işlemlerini tamamlamasını bekler. Her iki thread de işlemlerini tamamladığında, latch.await()
metodunun bloğu kalkar ve program devam eder.
Diğer bir senkronizasyon yöntemide, Mutex
sınıfıdır, birden fazla thread’in aynı anda belirli bir kaynağa erişmesini engellemek için kullanılabilir. Aşağıdaki örnek ile kullanımına bakabiliriz.
val mutex = Mutex()
var counter = 0runBlocking {
launch {
mutex.withLock {
counter++
}
} launch {
mutex.withLock {
counter++
}
}
}
Bu kod parçacığı, iki coroutine’i başlatır ve her iki coroutine’in de counter
değişkenini artırmasını sağlar. mutex.withLock
metodu sayesinde, her iki coroutine de aynı anda counter
değişkenine erişemez ve böylece veri yarışı (data race) ya da (race condition) oluşmaz.
CyclicBarrier
sınıfı, birden fazla thread’in belirli bir noktaya ulaşmasını beklemek için kullanılabilir. Aşağıdaki kod parçacığı, bu sınıfın nasıl kullanılabileceğini göstermektedir
val barrier = CyclicBarrier(2)Thread {
barrier.await()
}.start()Thread {
barrier.await()
}.start()
Bu kod parçacığı, iki thread’i başlatır ve her iki thread’in de belirli bir değişkene ulaşmasını bekler. Her iki thread de barrier.await()
metoduna ulaştığında, bu metodun bloğu kalkar ve program devam eder. Böylece, her iki thread de aynı anda işlemlerine devam eder.
Semaphore
sınıfı ise, birden fazla thread’in aynı anda belirli bir kaynağa erişmesini sınırlamak için kullanılabilir. Aşağıdaki kod parçacığı, bu sınıfın nasıl kullanılabileceğini göstermektedir
val semaphore = Semaphore(1)
var counter = 0Thread {
semaphore.acquire()
counter++
semaphore.release()
}.start()Thread {
semaphore.acquire()
counter++
semaphore.release()
}.start()
Bu kod parçacığı, iki thread’i başlatır ve her iki thread’in de counter
değişkenini artırmasını sağlar. semaphore.acquire()
ve semaphore.release()
metodları sayesinde, her iki thread de aynı anda kritik bölgeye erişemez ve böylece data race oluşmaz.
Sonuç olarak, Kotlin’de thread senkronizasyonu için birçok farklı yöntem bulunmaktadır. Bu yöntemlerin her biri, farklı senaryolarda kullanılabilir ve farklı avantajlar sunar. Uygulamanızın ihtiyaçlarına göre en uygun senkronizasyon yöntemini seçerek, uygulamanızın performansını ve güvenilirliğini artırabilirsiniz
source :
https://kotlinlang.org/docs/shared-mutable-state-and-concurrency.html#actors
ChatGPT communication, 15 June 2023. Source question “<Kotlin thread synchronization (latch,mutex,cyclicbarrier,semaphore)>.” https://chat.openai.com.