当多个线程同时访问同一个资源是,可能会出现资源竞争。例如:多个线程对同一个文件出现了读和写的操作,这就会产生竞态条件。如果都是读的话,就不会出现竞争,因为读数据不会造成影响,多个线程可以同时读取。
解决多线程的一种方式创建不可变量。也就是创建一个不可被改变的变量。
package com.concurenny.chapter.five;
/**
* 创建者:Mr lebron 创建时间:2017年11月17日 上午10:36:23
*/
public class ImmutableValue {
public static void main(String[] args) {
ImmutableValue immutableValue = new ImmutableValue();
System.out.println("原始对象:" + immutableValue);
System.out.println("修改之后:" + immutableValue.modify(10));
System.out.println("原始对象:" + immutableValue);
}
private int value;// 该值是不可变的,因为是私有的并且没有setter方法
private Referer referer;// 该值是不可变的,因为是私有的并且没有setter方法
public ImmutableValue() {
value = 0;
referer = new Referer();
}
public ImmutableValue(int value, Referer referer) {
super();
this.value = value;
this.referer = referer;
}
@Override
public String toString() {
return "ImmutableValue [value=" + value + ", referer=" + referer + "]";
}
public int getValue() {
return value;
}
public Referer getReferer() {
return referer;
}
public ImmutableValue modify(int plus) {
// 返回一个新的对象,对象的成员对象都必须是新值,防止引用对象被泄露,发生被改变的可能。
return new ImmutableValue(this.value + plus, new Referer(referer));
}
static class Referer {
private int value = 0;
public Referer() {
}
public Referer(Referer referer) {
this.value = referer.value;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
@Override
public String toString() {
return "Referer [value=" + value + "]";
}
}
}
引用资源:http://ifeve.com/thread-safety-and-immutability/