Rumah > Java > javaTutorial > Bagaimana untuk menerbitkan dan mengelakkan masalah melarikan diri objek di Jawa?

Bagaimana untuk menerbitkan dan mengelakkan masalah melarikan diri objek di Jawa?

WBOY
Lepaskan: 2023-04-22 14:37:08
ke hadapan
988 orang telah melayarinya

Menerbitkan objek

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>
Salin selepas log masuk

Objek melarikan diri

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>
Salin selepas log masuk
  • 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.

Penjelasan nama kelas.ini

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;    }  }}
Salin selepas log masuk

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.

Terbitkan objek dengan selamat

  1. Mulakan rujukan objek dalam fungsi permulaan statik

  2. Simpan rujukan objek kepada meruap medan taip atau objek AtomicReference

  3. Simpan rujukan objek ke domain jenis akhir yang membina objek dengan betul

  4. Simpan rujukan bagi objek Kepada domain yang dilindungi oleh kunci

boleh dikaitkan dengan mod lapar/mod malas dalam mod tunggal.

Dasar objek kongsi selamat

  1. Sekatan benang: Objek sekatan benang adalah eksklusif untuk urutan dan hanya boleh diubah suai oleh urutan yang memilikinya.

  2. Baca sahaja yang dikongsi: Objek baca sahaja yang dikongsi boleh diakses serentak oleh berbilang urutan tanpa penyegerakan tambahan, tetapi tiada urutan boleh mengubah suainya.

  3. 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 .

  4. 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!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan