阿里巴巴代码规范学习
1.volatile
volatile是一个特征修饰符(type specifier)。volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
如果两个线程想要取同一个值,A已经更新了数据,B还没有更新数据,那么为了让B取得最新的数据,设置变量为volatile
public class MyData {
//int number = 0; // 没加volatile关键字
volatile int number = 0;
int changeNumber() {
return this.number = 60;
}
}
public class violate {
// 验证可见性
public static void main(String[] args) {
MyData myData = new MyData();
new Thread("AAA") {
@Override
public void run() {
try {
Thread.sleep(3000);
// 睡3秒后调用changeNumber方法将number改为60
System.err.println(Thread.currentThread().getName()
+ " update number to " + myData.changeNumber());
} catch (InterruptedException e) {
e.printStackTrace();
}
};
}.start();
// 主线程
while (myData.number == 0) {
}
// 如果主线程读取到的一直都是最开始的0,
//将造成死循环,这句话将无法输出
System.err.println(Thread.currentThread().getName()
+ " get number value is " + myData.number);
}
}
2.深拷贝浅拷贝
public class Age implements Cloneable {
//年龄类的成员变量(属性)
private int age;
//构造方法
public Age(int age) {
this.age=age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return this.age+"";
}
@Override
public Object clone() {
Object obj=null;
try {
obj=super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return obj;
}
}
在 Student 的 clone() 方法中,需要拿到拷贝自己后产生的新的对象,然后对新的对象的引用类型再调用拷贝操作,实现对引用类型成员变量的深拷贝。
public class Student implements Cloneab