Java’ da Eşzamanlılık-2

Ebubekir Durukal
2 min readNov 29, 2021

--

Önceki yazıda multithread uygulamalarda thread’ lerin aynı anda bir data üzerinde işlem yapmak isteyebileceklerinden bahsetmiştik. Thread safe ifadesi Multithread olarak da düzgün biçimde davranan veri yapıları ve uygulamalar için kullanılır. Thread safety’ e ulaşmak için kullanılabilecek çeşitli metodlar vardır. Bu yazıda dataların bozulmadan işlem görmesi için kullanılan synchronized metodlardan ve AtomicInteger yapısından bahsedeceğim.

Synchronized anahtar kelimesi, tanımlanan metodun aynı anda sadece bir thread tarafından kullanılabilmesini garanti eder. Bu şekilde data integrity bozulmamış olur.

Örneğin yukarıdaki uygulamada increment metodu synchronized olarak tanımlanmıştır. Böylece programı her çalıştırdığımızda “Sayaç: 20000” çıktısını almamız garantidir. Eğer synchronized kelimesi kullanmasaydık programı her çalıştırdığımızda farklı bir sonuç elde edecektik. Çünkü birbirinden bağımsız iki thread’ in hızlarını önceden tahmin edemeyiz.

Thread safe uygulamalar yazarken kullanılan bir diğer yöntem ise Atomic değişkenler kullanmaktır. Atom, kelime manası ile bölünemez, tek parça demektir.

Yukarıdaki örnekteki counter metodu Atomic bir yapıda değil, standart int olarak tanımlanmıştır. getNextUniqueIndex() metodunda ise counter değerini okumak ve 1 artırmak üzere iki işlem yapılmaktadır. 2 farklı thread’ in bu metodu çağırarak counter değerini sürekli 1 artırdığını varsayalım. Kullanılan değişken Atomic olmadığı için bir thread counter değerini okuyup 1 artırmayı bitirmeden ikincisinin onu okuması olasıdır. Yani aslında multithread uygulamaların hızı dezavantajlı bir hale gelmeye başlamıştır. Bu hızı kontrol altına almak için ise aşağıdaki gibi bir kullanım daha makuldür.

getAndIncrement() metodu kullanarak bir değişken üzerinde bir thread’ in işi bitmeden diğerinin başlamayacağını garanti ederek thread safety’ e ulaşmış oluyoruz. Atomic değişkenlerde compareAndSet(), addAndGet(), getAndUpdate() gibi kullanışlı metodlar da vardır.

Bu yazıda synchronized metodlardan ve AtomicInteger yapısından bahsettik. Thread safety’ e her iki kullanım ile ulaşabilse bile Atomic değişkenler thread safety’ i obje üzerinde garantilemekte ve bizi instance’ ın durumunu tekrar kontrol etmekten kurtarmaktadır. Gene de hangi kullanımın daha uygun olduğu duruma göre değerlendirilmelidir.

--

--