Geçici ve Uçucu Değiştiriciler nelerdir?


126

Java'da transientve volatiledeğiştiricilerin ne anlama geldiğini birisi açıklayabilir mi?


3
Bu açıkça bir soru değildi ve bu yine de bir kopya (bu yüzden kapatmaya oy verdim). Örneğin bkz. Java'nın neden geçici değişkenleri var? ve Java'da uçucu anahtar kelimeyi tam olarak ne zaman kullanıyorsunuz? (ve diğerleri).
Pascal Thivent


18
Bu tamamen geçerli bir sorudur, eşdeğerdir: stackoverflow.com/questions/215497/…
Barry Fruitman

Yanıtlar:


156

volatileVe transientdüzenleyiciler sınıfların alanlara uygulanabilen 1 alan türü ne olursa olsun. Bunun dışında birbirleriyle alakasızlar.

transientDeğ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 nullbir referans türü için ve sıfır veya falseilkel bir tür için. JLS'nin (bkz. 8.3.1.3 ) ne transientanlama 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 staticalanı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.)

volatileDeğ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 longveya doublebazı 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.


10

volatileve transientanahtar kelimeler

1) transientanahtar kelime, onları serileştirme işleminin dışında bırakmak için örnek değişkenlerle birlikte kullanılır. Bir alan transientdeğeri ise kalıcı olmayacaktır.

Öte yandan, volatileanahtar kelime bir Java değişkenini "ana bellekte depolanıyor" olarak işaretlemek için kullanılır.

Bir volatiledeğişkenin her okunması CPU önbelleğinden değil bilgisayarın ana belleğinden okunacak ve bir değişkene yapılan her yazma volatileyalnızca CPU önbelleğine değil ana belleğe yazılacaktır.

2) transientanahtar kelime, anahtar kelimeyle birlikte kullanılamaz, staticancak volatilebirlikte kullanılabilir static.

3) transientdeğ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


2
transientDeğişkenin staticanahtar 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
Chaklader Asfak Arefe

Aslında, JLS izin verir staticve transientbirlikte kullanılabilir. Sorun şu ki biraz mantıklı, çünkü tipik serileştirme mekanizmaları zaten statiği sürdürmüyor.
Stephen C

7

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.

http://www.geekinterview.com/question_details/2


5
"Böylece derleyici bunlara erişime izin verir." Cümleniz başlıkların varsayılan olarak erişime sahip olmadığını gösteriyor. Şimdi bağlantıyı ve anladığım diğer cevabı okudum: derleyici, değişkenin herhangi bir iş parçacığına özgü ara depolamasını yapmaz, böylece diğer iş parçacıkları değişiklikleri anında görebilir.
helios

Uçucu C kullanımını ve uçucu java kullanımını karıştırdım. Derleyicinin, önbelleğe alınmış bir değerden ziyade alanın gerçek değerine erişmesini sağladığını kastettim.
Raynos

bundan daha fazlasını ifade ediyor.
Stephen C

1

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.