它实际上是重新定义了一个新的 buf[] 来保存数据,这样在后返回数据的时候确实没有修改 原始的value[],而是将替换后的字符串作为返回值返回了。
class A {
//定义一个 A 对象名字叫 aObj ,值为 1
private Long aObj = Long.valueOf(1);
//定义一个 B 对象名字叫 bObj,值为 1
private Long bObj = Long.valueOf(1);
private void a() {
//锁对象是 aObj
synchronized (aObj) {
System.out.println("正在执行A方法,5秒以后退出");
try {
TimeUnit.SECONDS.sleep(5);
System.out.println("A执行结束......");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void b() {
//锁对象是 bObj
synchronized (bObj) {
System.out.println("正在执行B方法,2秒以后退出");
try {
TimeUnit.SECONDS.sleep(2);
System.out.println("B执行结束......");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException {
A a = new A();
//开通两个线程来执行,因为aObj 和 bObj 是不同的对象,所以理论上应该是互不干扰的
new Thread(a::a).start();
TimeUnit.SECONDS.sleep(1);
new Thread(a::b).start();
}
}
对象的所有属性都是 final 的,并不能保证不可变性; 不可变对象也需要正确发布。
class D {
final C c;
public D(C c) {
this.c = c;
}
private void changeValue(int salary) {
c.setSalary(salary);
}
public static void main(String[] args) {
C c = new C();
c.setSalary(1);
System.out.println("c.getSalary() = " + c.getSalary());
D d = new D(c);
d.changeValue(3);
System.out.println("c.getSalary() = " + c.getSalary());
}
}