Rumah > Soal Jawab > teks badan
我们知道不变对象是指一旦创建不能修改内部状态的对象,因为不变对象没有提供可供修改内部状态的方法,所以不变对象是线程安全的。但是String,当然包括其他的基本数据的包装类,如Integer/Long/Float等等,也是不变对象,但却是可以修改值的,这怎么保证线程安全?
public class Test{
private String str;
public void test(){
if(("").equals(str)){ //多个线程同时判断,可能导致多次执行
str = "1";
//do something
}
}
}
天蓬老师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
}
}
}
阿神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