Apa itu Pengubah Transien dan Volatile?


126

Bisakah seseorang menjelaskan apa arti transientdan volatilepengubah di Jawa?


3
Ini jelas bukan pertanyaan dan ini adalah duplikat pula (itulah sebabnya saya memilih untuk menutup). Lihat misalnya. Mengapa Java memiliki variabel sementara? dan kapan tepatnya Anda menggunakan kata kunci yang mudah menguap di Jawa? (dan banyak lainnya).
Pascal Thivent


18
Ini adalah pertanyaan yang benar-benar valid, setara dengan: stackoverflow.com/questions/215497/…
Barry Fruitman

Jawaban:


156

The volatiledan transientpengubah dapat diterapkan untuk bidang kelas 1 terlepas dari jenis lapangan. Selain itu, mereka tidak berhubungan.

The transientpengubah menceritakan Jawa serialisasi objek subsistem untuk mengecualikan lapangan saat serialisasi sebuah instance dari kelas. Ketika objek kemudian deserialized, bidang akan diinisialisasi ke nilai default; yaitu nulluntuk tipe referensi, dan nol atau falseuntuk tipe primitif. Perhatikan bahwa JLS (lihat 8.3.1.3 ) tidak mengatakan apa transientartinya, tetapi mengacu pada Spesifikasi Seriisasi Objek Java . Mekanisme serialisasi lain mungkin memperhatikan transient-nessness lapangan . Atau mereka mungkin mengabaikannya.

(Perhatikan bahwa JLS mengizinkan staticbidang untuk dideklarasikan sebagai transient. Kombinasi ini tidak masuk akal untuk serialisasi Java Object, karena bagaimanapun juga serialisasi statika. Namun, itu bisa masuk akal dalam konteks lain, jadi ada beberapa pembenaran untuk tidak melarangnya langsung.)

The volatilepengubah memberitahu JVM yang menulis ke lapangan harus selalu serentak memerah ke memori, dan yang bertuliskan lapangan harus selalu dibaca dari memori. Ini berarti bahwa bidang yang ditandai sebagai volatile dapat diakses dan diperbarui dengan aman di aplikasi multi-utas tanpa menggunakan sinkronisasi asli atau standar berbasis perpustakaan. Demikian pula, membaca dan menulis ke bidang yang mudah menguap adalah atom. (Ini tidak berlaku untuk >> non-volatile << longatau doublebidang, yang dapat dikenakan "perobekan kata" pada beberapa JVM.) Bagian yang relevan dari JLS adalah 8.3.1.4 , 17.4 dan 17.7 .


1 - Tetapi tidak untuk variabel atau parameter lokal.


10

volatiledan transientkata kunci

1) transientkata kunci digunakan bersama dengan variabel instan untuk mengeluarkannya dari proses serialisasi. Jika bidang transientisinya nilainya tidak akan bertahan.

Di sisi lain, volatilekata kunci digunakan untuk menandai variabel Java sebagai "disimpan di memori utama".

Setiap pembacaan volatilevariabel akan dibaca dari memori utama komputer, dan bukan dari cache CPU, dan bahwa setiap penulisan ke volatilevariabel akan ditulis ke memori utama, dan bukan hanya untuk cache CPU.

2) transientkata kunci tidak dapat digunakan bersama dengan statickata kunci tetapi volatiledapat digunakan bersama static.

3) transientvariabel diinisialisasi dengan nilai default selama de-serialisasi dan ada penugasan atau pemulihan nilai harus ditangani oleh kode aplikasi.

Untuk informasi lebih lanjut, lihat blog saya:
http://javaexplorer03.blogspot.in/2015/07/difference-between-volatile-and.html


2
Alasan transientvariabel tidak dapat digunakan bersama dengan statickata kunci adalah variabel statis milik kelas dan bukan untuk instance individu. Konsep serialisasi berkaitan dengan keadaan objek saat ini. Hanya data yang terkait dengan instance spesifik kelas yang diserialisasi, oleh karena itu bidang anggota statis diabaikan selama serialisasi
Chaklader Asfak Arefe

Sebenarnya, JLS mengizinkan staticdan transientuntuk digunakan bersama. Masalahnya adalah itu tidak masuk akal, karena mekanisme serialisasi tipikal tidak bertahan statika pula.
Stephen C

7

Volatile berarti utas lain dapat mengedit variabel tertentu. Jadi kompiler memungkinkan akses ke mereka.

http://www.javamex.com/tutorials/synchronization_volatile.shtml

Transient berarti bahwa ketika Anda membuat serial objek, ia akan mengembalikan nilai defaultnya pada de-serialisasi

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


5
"Jadi kompiler memungkinkan akses ke mereka." Kalimat Anda menunjukkan bahwa utas tidak memiliki akses secara default. Sekarang saya membaca tautan dan jawaban lain yang saya mengerti: compiler tidak melakukan jenis penyimpanan perantara thread-spesifik variabel sehingga thread lain dapat melihat perubahan secara langsung.
helios

Saya menggunakan C volatile dan java menggunakan volatile bingung. Maksud saya kompilator memastikan ia memiliki akses ke nilai actaul bidang daripada nilai cache.
Raynos

itu berarti lebih dari itu.
Stephen C

1

Sementara:

Pertama-tama perlu tahu di mana perlu bagaimana menjembatani kesenjangan.

1) Transient pengubah akses hanya berlaku untuk komponen variabel saja. Itu tidak akan digunakan dengan metode atau kelas.

2) Kata kunci sementara tidak dapat digunakan bersama dengan kata kunci statis.

3) Apa itu serialisasi dan di mana ia digunakan? Serialisasi adalah proses untuk membuat keadaan objek tetap. Itu berarti keadaan objek diubah menjadi aliran byte yang akan digunakan untuk bertahan (misalnya menyimpan byte dalam file) atau mentransfer (misalnya mengirim byte melalui jaringan). Dengan cara yang sama, kita dapat menggunakan deserialization untuk mengembalikan status objek dari byte. Ini adalah salah satu konsep penting dalam pemrograman Java karena serialisasi banyak digunakan dalam pemrograman jaringan. Objek-objek yang perlu ditransmisikan melalui jaringan harus dikonversi menjadi byte. Sebelum memahami kata kunci sementara, kita harus memahami konsep serialisasi. Jika pembaca tahu tentang serialisasi, lewati poin pertama.

Catatan 1) Transient terutama digunakan untuk proses serialisasi. Untuk itu kelas harus mengimplementasikan antarmuka java.io.Serializable. Semua bidang di kelas harus serial. Jika suatu bidang tidak serializable, itu harus ditandai sementara.

Catatan 2) Ketika proses deserialized terjadi mereka diatur ke nilai default - nol, salah, atau nol sesuai batasan tipe.

Catatan 3) Kata kunci sementara dan tujuannya? Bidang yang dideklarasikan dengan pengubah sementara tidak akan mengambil bagian dalam proses serial. Ketika sebuah objek serial (disimpan dalam keadaan apa pun), nilai bidang transiennya diabaikan dalam representasi serial, sedangkan bidang selain bidang transien akan mengambil bagian dalam proses serialisasi. Itulah tujuan utama kata kunci sementara.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.