Java'da transient
ve volatile
değiştiricilerin ne anlama geldiğini birisi açıklayabilir mi?
Java'da transient
ve volatile
değiştiricilerin ne anlama geldiğini birisi açıklayabilir mi?
Yanıtlar:
volatile
Ve transient
düzenleyiciler sınıfların alanlara uygulanabilen 1 alan türü ne olursa olsun. Bunun dışında birbirleriyle alakasızlar.
transient
Değiştirici sınıfının bir örneğini seri hale alanını dışlamak için Java nesne seri hale alt sistemini anlatır. Nesne daha sonra serileştirildikten sonra, alan varsayılan değerle başlatılacaktır; yani null
bir referans türü için ve sıfır veya false
ilkel bir tür için. JLS'nin (bkz. 8.3.1.3 ) ne transient
anlama geldiğini söylemediğini , ancak Java Nesne Serileştirme Belirtimini ertelediğini unutmayın . Diğer seri mekanizmalar olabilir bir alanın dikkat transient
-lık. Ya da görmezden gelebilirler.
(JLS'nin bir static
alanın olarak ilan edilmesine izin verdiğini unutmayın transient
. Bu kombinasyon Java Nesne Serileştirme için mantıklı değildir, çünkü yine de statiği serileştirmez. Ancak, diğer bağlamlarda mantıklı olabilir, bu nedenle bazı gerekçeler vardır. tamamen yasaklamıyor.)
volatile
Değiştirici alanına yazıyor her zaman senkronize olarak belleğe yıkanmalıdır ve bu her zaman bellekten okumalısınız alanın okuması JVM söyler. Bu, geçici olarak işaretlenen alanlara, yerel veya standart kitaplık tabanlı senkronizasyon kullanılmadan çok iş parçacıklı bir uygulamada güvenli bir şekilde erişilebileceği ve güncellenebileceği anlamına gelir. Benzer şekilde, uçucu alanlara okuma ve yazma işlemleri atomiktir. (Bu >> için uçucu olmayan << geçerli değildir long
veya double
bazı JVMs üzerinde "kelimesi yırtılmaya" tabi olabilir ki, alanlar.) JLS alakalı bölümlerdir 8.3.1.4 , 17.4 ve 17.7 .
1 - Ancak yerel değişkenlere veya parametrelere değil.
volatile
ve transient
anahtar kelimeler
1) transient
anahtar kelime, onları serileştirme işleminin dışında bırakmak için örnek değişkenlerle birlikte kullanılır. Bir alan transient
değeri ise kalıcı olmayacaktır.
Öte yandan, volatile
anahtar kelime bir Java değişkenini "ana bellekte depolanıyor" olarak işaretlemek için kullanılır.
Bir volatile
değişkenin her okunması CPU önbelleğinden değil bilgisayarın ana belleğinden okunacak ve bir değişkene yapılan her yazma volatile
yalnızca CPU önbelleğine değil ana belleğe yazılacaktır.
2) transient
anahtar kelime, anahtar kelimeyle birlikte kullanılamaz, static
ancak volatile
birlikte kullanılabilir static
.
3) transient
değişkenler, serileştirmenin kaldırılması sırasında varsayılan değerle başlatılır ve değerin atanması veya geri yüklenmesi, uygulama kodu tarafından ele alınmalıdır.
Daha fazla bilgi için bloguma bakın:
http://javaexplorer03.blogspot.in/2015/07/difference-between-volatile-and.html
transient
Değişkenin static
anahtar kelimeyle birlikte kullanılamamasının nedeni, herhangi bir örneğe değil, bir sınıfa ait olan statik değişkenlerdir. Serileştirme kavramı nesnenin mevcut durumu ile ilgilidir. Yalnızca bir sınıfın belirli bir örneğiyle ilişkili veriler serileştirilir, bu nedenle statik üye alanları serileştirme sırasında göz ardı edilir
static
ve transient
birlikte kullanılabilir. Sorun şu ki biraz mantıklı, çünkü tipik serileştirme mekanizmaları zaten statiği sürdürmüyor.
Uçucu, diğer iş parçacıklarının bu belirli değişkeni düzenleyebileceği anlamına gelir. Böylece derleyici bunlara erişime izin verir.
http://www.javamex.com/tutorials/synchronization_volatile.shtml
Geçici, bir nesneyi serileştirdiğinizde, serileştirmeden çıkarken varsayılan değerini döndüreceği anlamına gelir.
Geçici :
Öncelikle, boşluğu nasıl kapatması gerektiğini bilmek gerekir.
1) Bir Access değiştirici geçişi yalnızca değişken bileşen için geçerlidir. Yöntem veya sınıf ile kullanılmayacaktır.
2) Geçici anahtar kelime, statik anahtar kelime ile birlikte kullanılamaz.
3) Serileştirme nedir ve nerede kullanılır? Serileştirme, nesnenin durumunu kalıcı hale getirme işlemidir. Bu, nesnenin durumunun devam ettirmek (örneğin bir dosyada baytları depolamak) veya aktarmak (örneğin bir ağ üzerinden bayt göndermek) için kullanılacak bir bayt akışına dönüştürüldüğü anlamına gelir. Aynı şekilde, nesnenin durumunu baytlardan geri getirmek için seriyi kaldırmayı kullanabiliriz. Bu Java programlamadaki önemli kavramlardan biridir çünkü serileştirme çoğunlukla ağ programlamasında kullanılır. Ağ üzerinden iletilmesi gereken nesnelerin bayta dönüştürülmesi gerekir. Geçici anahtar kelimeyi anlamadan önce serileştirme kavramını anlamak gerekir. Okuyucu serileştirmeyi biliyorsa, lütfen ilk noktayı atlayın.
Not 1) Geçici, esas olarak serileştirme işlemi için kullanılır. Bunun için sınıfın java.io.Serializable arabirimini uygulaması gerekir. Sınıftaki tüm alanlar serileştirilebilir olmalıdır. Bir alan serileştirilebilir değilse, geçici olarak işaretlenmelidir.
Not 2) Seri durumdan arındırılmış işlem gerçekleştiğinde, bunlar varsayılan değere - tür kısıtlamasına göre sıfır, yanlış veya null olarak ayarlanır.
Not 3) Geçici anahtar kelime ve amacı? Geçici değiştirici ile bildirilen bir alan serileştirilmiş işlemde yer almayacaktır. Bir nesne serileştirildiğinde (herhangi bir durumda kaydedildiğinde), geçici alanların değerleri seri gösterimde yok sayılırken, geçici alanlar dışındaki alan serileştirme işleminde yer alır. Geçici anahtar kelimenin ana amacı budur.