volatileJava'da anahtar kelimeyi kullandığımızda perde arkasında neler olduğuna ve neden senkronizasyonun tam yerini almadığına kısa bir bakış
Java içindeki eşzamanlılık ve çok iş parçacıklı uygulamaların karanlık dünyasına girerken,
volatileanahtar kelimeyle karşılaşmanız muhtemeldir.
Bu anahtar kelime, bir değişkende yapılan herhangi bir değişikliğin diğer ileti dizileri tarafından hemen görülebilmesini sağlamak için kullanılabilir, bu nedenle verilerimizin eski, senkronize olmayan ve yanlış hale gelmesini önlemeye yardımcı olur.
Bu anahtar kelimeyle ilgili herhangi bir belgeyi araştırdığınızda, bir değişkenin önbellekten değil doğrudan bellekten okunmasını sağlayarak çalıştığını öğreneceksiniz. Bu harika… ama aslında ne anlama geliyor?
volatile
Çok iş parçacıklı bir uygulamada, her iş parçacığının ayrı bir CPU aracılığıyla çalıştırılması mümkündür.
Değişkenlerle çalışırken, her iş parçacığı , performansı artırmak için bir değişkenin değerinin ana bellekten bir kopyasını oluşturabilir ve bunu kendi CPU önbelleğinde saklayabilir.
Bu, iş parçacığının bir değişkenin değerine erişmesi gerektiğinde, bunun CPU önbelleğinden okunabilmesini ve ana belleğe erişmesi gerekmemesini sağlayarak zamandan tasarruf edilmesini sağlar.
Yukarıdaki örnekte,
myVargeçici değildir ve bu nedenle, Java Sanal Makinesi'nin (JVM) herhangi bir CPU önbelleğinden ana belleğe veri okuduğuna veya bunlardan herhangi birine veri yazdığına bağlı olarak veriler senkronize olmayabilir.
Örneğin, iş parçacıklarından biri değeri 5 olarak güncellerse, değerinin CPU önbelleğinden ana belleğe
myVarne zaman yazılacağının garantisi yoktur .
myVar
Bu
myVar, CPU önbelleklerinden birindeki değerin ana bellekteki değerle aynı olmayabileceği ve iş parçacıkları arasında farklı değerlere yol açabileceği anlamına gelir.
değişken yaparak
volatileve böylece bir CPU önbelleğinin aksine her zaman ana bellekten değer okuyup yazarken bu sorun önlenebilir.
bu nedenle kullanabiliriz
volatileDeğerlerimizi her zaman belirli bir CPU önbelleğinden değil, ana bellekten okuduğumuzdan emin olmak için kodumuzdaki anahtar kelime.
Aşağıdaki sınıfta
myVar, değil
volatile. Okuyan ve güncelleyen 1 iş parçacığımız varsa
myVar, diğer birden çok iş parçacığı tarafından okunurken
myVar, er ya da geç yukarıdaki şemalarda gösterildiği gibi CPU önbelleklerinde senkronizasyon dışı olacaktır.
public class MyNonThreadSafeCode { public int myVar = 1; }
public class MyThreadSafeCode { public volatile int myVar = 1; }
Peki kodumuzda ne zaman volatile kullanmalıyız? Ne gibi avantajlar sunuyor? Aşağıda birkaç tanesini özetledim:
Yukarıda açıklandığı gibi,
volatileanahtar kelime uçucu bir değişkende yapılan herhangi bir değişikliğin diğer ileti dizileri tarafından hemen görülebilmesini sağlar. Bu, bir iş parçacığının bir değişkenin değerinin en güncel olmayan önbelleğe alınmış bir kopyasına sahip olabileceği eski veriler sorununun önlenmesine yardımcı olur.
Uçucu değişkenlerin kullanılması, iş parçacıklarının kilitlere veya diğer senkronizasyon mekanizmalarına ihtiyaç duymadan birbirleriyle iletişim kurmasına izin vererek çoklu iş parçacıklı kullanımı basitleştirebilir . Bu, karmaşık ve genellikle hataya açık kilitleme kodu ihtiyacını ortadan kaldırabilir.
synchronizedAyrıca , doğru kullanıldığında kodu kilitlere veya bloklara göre daha temiz ve okunması daha kolay tuttuğunu düşünüyorum .
Belirli durumlarda, uçucu değişkenlerin kullanılması, kilit ihtiyacını azalttığı için performansı artırabilir. Bununla birlikte, volatile anahtar sözcüğünü kullanmak, yanlış kullanıldığında aslında performans üzerinde olumsuz bir etkiye sahip olabilir. Nasıl/neden konusunu aşağıdaki "Geçici anahtar kelimeyi kullanırken dikkat edilmesi gereken noktalar ve sakıncalar" bölümünde ele aldım.
Uçucu değişkenler, iş parçacıkları arasında basit bir sinyalleşme mekanizması olarak kullanılabilir. Örneğin, bir iş parçacığı, başka bir iş parçacığının belirli bir görevi tamamladığının sinyalini vererek geçici bir değişkenin değerini değiştirmesini bekleyebilir.
Bunların hepsi kulağa oldukça iyi geliyor, ama
volatilesihirli değnek değil. Yalnızca ihtiyaç duyulduğunda kullanılmalıdır ve
synchronizedkodunuzdaki senkronizasyonun (örn. anahtar kelime aracılığıyla) doğrudan yerine geçmez. İşte nedeni:
Anahtar kelime ,
volatiledeğişken değerinizin doğrudan ana bellekten okunacağı anlamına geldiği için performans üzerinde olumsuz bir etkisi olacaktır.
Bu nedenle,
volatileanahtar kelime sadece bir değişken değişmez olmadığında (yani değiştirilecekse) ve eşzamanlı bir ortamda kullanılacaksa (yani, birden fazla iş parçacığı tarafından erişilecekse), engellememek için kullanılmalıdır. uygulamanızın performansı.
Yukarıdaki örneklerden de görebileceğiniz gibi, bir
volatiledeğişkene eriştiğimizde herhangi bir kilitlenme olmuyor. Bu nedenle, anahtar kelime gibi diğer kod iş parçacığı güvenli hale getirme yöntemlerinden farklı olarak
synchronized, volatile anahtar kelimesi “oku-değiştir-yaz” işlemi gerçekleştirmek istediğimiz durumlar için kullanılmamalıdır.
Örneğin, bir sayaç uygulamamız varsa, tipik bir kullanım durumu, bir artırma yöntemi uygulamak olacaktır. Bu metot , sayacın mevcut değerini okuyacak , mevcut değere 1 ekleyerek değiştirecek ve ardından yeni değeri sayaca geri yazacaktır .
Bu işlemlerin her biri, tek bir CPU yönergesinde/döngüsünde gerçekleşmeyebilir. Bu nedenle, orijinal iş parçacığının okuma ve yazma işlemleri arasında sayaç değişkenine erişerek başka bir iş parçacığının müdahale etmesi mümkündür . Böylece, sayaca yapılan bir artış kolayca gözden kaçırılabilir.
Örneğin
Thread 1
counterana bellekten 0 değerini okur
Thread 1
counterdeğerini 1 olarak değiştirmek için hesaplama yapar
Thread 2
counterana bellekten 0 değerini okur
Thread 1değerini
counter1 olarak ana belleğe yazar
Thread 2
counterdeğerini 1 olarak değiştirmek için hesaplama yapar
Thread 2değerini
counter1 olarak ana belleğe yazar
Kısacası,
volatileanahtar kelime yalnızca geçici bir değişkende yapılan herhangi bir değişikliğin diğer ileti dizileri tarafından hemen görülebileceğini garanti eder. Bir iş parçacığı tarafından yapılan değişikliklerin, başka bir iş parçacığı güncellenen değeri görmeden önce tamamlanacağını garanti etmez.
Öte yandan senkronizasyon, aynı anda yalnızca bir iş parçacığının belirli bir kod bölümünü yürütmesini sağlamak için kilitler kullanarak bellek tutarlılığı için daha güçlü garantiler sağlar. Bu, bir iş parçacığı tarafından yapılan değişikliklerin, başka bir iş parçacığı güncellenen değeri görmeden önce tamamlanmasını sağlar.
volatileyalnızca değişkenler için geçerliyken,
synchronizedanahtar kelime, tüm yöntemlere ve kod bloklarına uygulanabilir. Bu nedenle, özel kullanım durumunuz için hangi yöntemin en iyi sonucu verdiğini düşünmek önemlidir.
Bunu okumak için zaman ayırdığınız için çok teşekkür ederim. Uçucu anahtar kelimenin gerçekte nasıl çalıştığını ve ne zaman kullanılacağını anlamanıza umarım yardımcı olmuştur.
Bunu beğendiyseniz veya bilgilendirici bulduysanız, lütfen diğer makalelerimden bazılarını okumayı veya beni Medium'da takip etmeyi düşünün. Şerefe!
Teknoloji dünyasında, işletmeler sürekli olarak siber suçluların şeytani faaliyetlerinin tuzağına düşme riski altındadır. Endişe verici derecede sık hale gelen böyle bir taktik, kimlik bilgilerini doldurmaktır.
Modern veri bulutunun içinde ve sırada ne var? Veri adası sorunları ve ilk 8 trend Prelude Data Cloud uçsuz bucaksız bir alemdir.
Teknoloji dünyasında, işletmeler sürekli olarak siber suçluların şeytani faaliyetlerinin tuzağına düşme riski altındadır. Endişe verici derecede sık hale gelen böyle bir taktik, kimlik bilgilerini doldurmaktır.
Etrafımızdaki dünya gibi, dil de sürekli değişiyor. Önceki dönemlerde dil değişiklikleri yıllar hatta on yıllar içinde meydana gelirken, artık günler hatta saatler içinde gerçekleşebilir.
Doğası gereği, spor bizi rekabet etmeye zorlamak için tasarlanmıştır. Rekabetçi sporcular olarak, diğer sporculara karşı sürekli rekabet etme baskısına kapılmak kolaydır, ancak ya dış rekabete odaklanmak yerine, odak noktanızı iç rekabete kaydırsaydınız? Bu, başkalarını yenmeye çalışmak yerine kendinizle rekabet etmek ve kendi performansınızı geliştirmek için çabalamak anlamına gelir.
Kalbini kontrol et. Çoğu zaman kalbimiz sızlar.