Thread Local konusu ilginç, ilginç olduğu kadar da kullanışlı bir yapıdır. Birçok Java programcısının adını bile duymadığı bu güzel yapıyı basitçe anlatmaya çalışacağım.
Thread Local, veri saklamak için kullandığımız geçerlilik bölgelerine benzer bir yapı olarak düşünülebilir. Web uygulamalarında scope kavramı adındaki makalemde bu konuya değinmiştim.
Aynı request scope, session scope gibi herhangi bir nesneyi, bir thread içerisine set etmemizi sağlar. Thread Local içerisine set edilen nesnelere, aynı thread’e erişilen her yerden ulaşılabilir. Bunun yanında her bir thread’in kendi özel Thread Local değişkeni vardır. Bir thread başka bir thread’in Thread Local değişkenlerine erişemez.
Normalde kod yazarken yarattığımız nesneler birden fazla thread tarafından erişilerek paylaşılabilir. Bunu istemiyorsak ve her bir thread’in kendi yerel değişkenlerini kullanmak istiyorsak ThreadLocal kullanılabilir.
Başka bir deyişle thread-safe olmayan bir nesnemiz varsa ve synchronization işlemlerinden kaçınmak istiyorsak nesnelerimizi thread’e özel tanımlarız.
Pek çok frameworkte ThreadLocal kullanımıyla karşılaşırız. Örneğin varolan bir transaction ThreadLocal’de saklandığında, bu transaction’ı her bir metoda parametre göndermeye gerek kalmaz. Bu sayede rahatça istendiği zaman istendiği yerden erişilebilir.
Örneğin bir projede veri tabanına bağlanmak için kullandığımız Connection, PreparedStatement ve ResultSet arabirimlerini ThreadLocal değişkeni olarak yaratmak mantıklı olabilir.
[codesyntax lang=”java” lines=”no”]
private static ThreadLocal<Connection> connection = new ThreadLocal<Connection>();
private static ThreadLocal<List<PreparedStatement>> stmtList = new ThreadLocal<List<PreparedStatement>>();
private static ThreadLocal<List<ResultSet>> rsList = new ThreadLocal<List<ResultSet>>();
[/codesyntax]
Bağlantıları yöneten sınıfta Connection, PreparedStatement listesi ve ResultSet listesi saklayan ThreadLocal değişkenler tanımladığımızı düşünelim. Bağlantıyı connection pool’dan alırken ThreadLocal tanımlanan bu değişken değerleri set’lenerek daha sonra get metodu ile değerleri okunabilir.
Bu sayede katmanlar arasındaki ilişki bağımsız olarak kalmış olur ve nesneler parametre olarak gönderilmeden ilgili sınıflardan çağrılarak kullanılabilir.
ThreadLocal sınıfı Java 2’den beri var olan bir sınıftır. İçerisinde get, set, initialValue ve remove metotları bulunur.
get() : ThreadLocal değişkeninin değerini döndürür.
set(T value) : ThreadLocal değişkeninin değerini günceller.
initialValue() : ThreadLocal değişkeninin ilk değerini döndürür.
remove() : ThreadLocal değişkeninin değerini siler. (Java 5 ile eklendi)
Bu 4 metodun yanında bir de parametre almayan default constructor’ı bulunan ThreadLocal sınıfını daha da detaylı olarak incelemek için lütfen tıklayın.