在高并发编程中,作者举了一个内部可变状态escape的例子,不是很理解,自己又测试了一下,跟大家共享一下。
class UnsafeStates {
private String[] states = new String[] {"AK","AL"};
public String[] getStates(){
return states;
}
}
public class UnsafeStatesTest {
public static void main(String[] args) {
UnsafeStates us = new UnsafeStates();
String[] argStr = us.getStates();
argStr[0] = "AKL";
System.out.println(us.getStates()[0]);
}
}
结果:
AKL
理解重点:
1.String的存储方式
一般String类中字符串值都是直接存值的。但像String str = "abc";这种场合下,其字符串值却是保存了一个指向存在栈中数据的引用! 用new()来新建对象的,都会在堆中创建,而且其字符串是单独存值的,即使与栈中的数据相同,也不会与栈中的数据共享
2.unsafe的发布方式,将会使别的对象可以调用对象内部私有的属性,导致私有变量失去意义。