cari

Rumah  >  Soal Jawab  >  teks badan

java - String是线程安全的吗?那String岂不是不能进行同步?

  1. 我们知道不变对象是指一旦创建不能修改内部状态的对象,因为不变对象没有提供可供修改内部状态的方法,所以不变对象是线程安全的。但是String,当然包括其他的基本数据的包装类,如Integer/Long/Float等等,也是不变对象,但却是可以修改值的,这怎么保证线程安全?

public class Test{

private String str;

public void test(){
        if(("").equals(str)){  //多个线程同时判断,可能导致多次执行
            str = "1";
            //do something
        }
}

}

怪我咯怪我咯2767 hari yang lalu622

membalas semua(2)saya akan balas

  • 天蓬老师

    天蓬老师2017-04-18 10:29:08

    Cari objek lain yang boleh dikunci, kuncinya dan kemudian ubah suai String.

    private String lock = new Object();
    private String str;
    public void test(){
        synchronized(lock) {
            if(("").equals(str)){  //多个线程同时判断,可能导致多次执行
                str = "1";
                //do something
            }
        }
    }

    balas
    0
  • 阿神

    阿神2017-04-18 10:29:08

    Di Java, objek jenis String itu sendiri tidak boleh diubah. Kerana String akan disimpan dalam kawasan memori yang dipanggil kolam malar.
    Contohnya

            String a="test";
            String b="test";
            System.out.println(a==b);
            System.out.println(System.identityHashCode(a));
            System.out.println(System.identityHashCode(b));

    Output:

    true
    851664923
    851664923

    Jadi kenapa anda rasa berubah-ubah lagi?

    String a="test";
    a="test1"
    

    Kemudian a menjadi test1 Malah, objek rentetan "test1" baharu dicipta di sini (jika kolam pemalar tidak mempunyai nilai ini, ia baru dicipta). Kemudian arahkan rujukan pembolehubah kepadanya. Nota: Keadaan dalaman pembolehubah "ujian" tidak diubah suai di sini Objek rentetan "ujian" adalah selamat untuk benang.
    Melainkan anda mengubah suainya dengan muktamad, semua titik pembolehubah boleh berubah.
    Untuk memastikan keselamatan benang dalam kes ini:
    Tidak 0: Anda boleh mempertimbangkan untuk menggunakan tidak menentu untuk memastikan keterlihatan.
    Pertama, anda boleh menggunakan pengubahsuaian akhir
    Kedua, anda boleh menggunakan objek atom seperti AtomicReference Untuk Integer, terdapat juga AtomicInteger dan seumpamanya
    Ketiga, kunci kawasan kod yang sepadan

    .

    balas
    0
  • Batalbalas