Kotlin’de thread senkronizasyonu

Abdullah IŞIK
2 min readJun 15, 2023

--

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 = 0
runBlocking {
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 = 0
Thread {
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.

--

--