参考URL:Java并发性和多线程介绍
1.创建不可变的共享对象保证对象在线程间共享时不会被修改
public class ImmutableValue {// 创建一个没有set方法的不可变的共享对象,即ImmutableValue类
private int value = 0;
public ImmutableValue(int value) {// 使用构造函数初始化value的值,一旦新建不能够改变
this.value = value;
}
public int getValue() {
return this.value;
}
public ImmutableValue add(int addValue){// 创建一个新的对象用于相加操作
return new ImmutableValue(this.value + addValue);
}
}
2.引用不是线程安全的!
即使一个对象是线程安全的对象,但是指向这个对象的引用也许不是线程安全的。也就是说ImmutableValue类是线程安全的,但使用它的类不是,牢记这点!
/**
* ImmutableValue类是线程安全的,但使用它的类不是,
* 要使Calculator类实现线程安全,将getValue()、setValue()和add()方法都声明为同步方法即可。
*/
public class Calculator{
/*
* 即使ImmutableValue是线程安全的,但是currentValue并不是线程安全的,
* 因为setValue()、add()会改变它的引用。
*/
private ImmutableValue currentValue = null;
public ImmutableValue getValue(){
return currentValue;
}
public void setValue(ImmutableValue newValue){
this.currentValue = newValue;
}
public void add(int newValue){
this.currentValue = this.currentValue.add(newValue);
}
}