Ringkasnya, ia adalah untuk memberikan rujukan kepada objek untuk mengekod di luar skop. Sebagai contoh, kembalikan objek, atau hantarkannya sebagai parameter kepada kaedah kelas lain.
Contoh objek penerbitan yang tidak selamat:
<code>@Slf4j</code><code>@NotThreadSafe</code><code>public class UnsafePublish {</code><code><br></code><code> private String[] states = {"a", "b", "c"};</code><code><br></code><code> public String[] getStates() {</code><code> return states;</code><code> }</code><code><br></code><code> public static void main(String[] args) {</code><code> UnsafePublish unsafePublish = new UnsafePublish();</code><code> log.info("{}", Arrays.toString(unsafePublish.getStates()));</code><code> // 发布对象不安全,可被修改</code><code> unsafePublish.getStates()[0] = "d";</code><code> log.info("{}", Arrays.toString(unsafePublish.getStates()));</code><code> }</code><code>}</code>
Jika kelas telah menyediakan rujukan objek kepada kod luaran dan melepaskan objek sebelum pembinaan selesai, ia dipanggil melarikan diri objek keselamatan benang.
<code>public class Escape {</code><code> private int thisCanBeEscape = 1;</code><code><br></code><code> public Escape() {</code><code> new InnerClass();</code><code> // 还有业务需要执行</code><code> thisCanBeEscape++;</code><code> }</code><code><br></code><code> private class InnerClass {</code><code> public InnerClass() {</code><code> log.info("{}", Escape.this.thisCanBeEscape);</code><code> }</code><code> }</code><code><br></code><code> public static void main(String[] args) {</code><code> new Escape();</code><code> }</code><code>}</code>
Instance kelas dalaman ini mengandungi rujukan kepada objek domain peribadi bagi contoh yang dikapsulkan. Ia akan dikeluarkan sebelum objek dibina dengan betul, yang mungkin tidak selamat ralat akan menyebabkan rujukan ini melimpah semasa pembinaan.
Kod di atas memulakan urutan semasa pembinaan fungsi. Sama ada ia permulaan tersirat atau permulaan eksplisit, ia akan menyebabkan limpahan rujukan ini. Benang baharu akan sentiasa melihat objek yang dimiliki sebelum ia dibina.
Sintaks "nama kelas.ini" dipanggil "melayakkan ini" dalam bahasa Java. Tujuan utama sintaks ini ialah: dalam kaedah kelas dalam, apabila anda ingin menentukan rujukan "ini" kelas luar pada tahap bersarang tertentu, gunakan sintaks "nama kelas luar.ini". Contohnya:
class Foo { class Bar { Foo getFoo() { return Foo.this; } }}
Dalam kaedah getFoo() dalam kelas Foo.Bar, jika anda menulis "ini" secara langsung, ia merujuk kepada contoh kelas Foo.Bar dan jika anda ingin menentukan tika ini bagi kelas Foo persisian , ia mesti ditulis sebagai Foo.ini di sini. Khususnya, jika anda menulis Bar.this dalam kaedah getFoo() dalam contoh di atas, kesannya adalah sama seperti menulis ini secara langsung, menyatakan contoh kelas Foo.Bar semasa.
Mulakan rujukan objek dalam fungsi permulaan statik
Simpan rujukan objek kepada meruap medan taip atau objek AtomicReference
Simpan rujukan objek ke domain jenis akhir yang membina objek dengan betul
Simpan rujukan bagi objek Kepada domain yang dilindungi oleh kunci
boleh dikaitkan dengan mod lapar/mod malas dalam mod tunggal.
Sekatan benang: Objek sekatan benang adalah eksklusif untuk urutan dan hanya boleh diubah suai oleh urutan yang memilikinya.
Baca sahaja yang dikongsi: Objek baca sahaja yang dikongsi boleh diakses serentak oleh berbilang urutan tanpa penyegerakan tambahan, tetapi tiada urutan boleh mengubah suainya.
Objek selamat benang: Objek atau bekas selamat benang yang menggunakan mekanisme penyegerakan untuk memastikan keselamatan benang secara dalaman, jadi urutan lain boleh mengaksesnya sesuka hati melalui antara muka awam tanpa penyegerakan tambahan .
Objek yang dijaga: Objek yang dikawal hanya boleh diakses dengan memperoleh kunci tertentu.
Atas ialah kandungan terperinci Bagaimana untuk menerbitkan dan mengelakkan masalah melarikan diri objek di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!