您的位置:首页 > 编程语言 > Java开发

操作 java并发-线程安全及不可变性(5)

2017-11-17 13:38 471 查看
当多个线程同时访问同一个资源是,可能会出现资源竞争。例如:多个线程对同一个文件出现了读和写的操作,这就会产生竞态条件。如果都是读的话,就不会出现竞争,因为读数据不会造成影响,多个线程可以同时读取。

解决多线程的一种方式创建不可变量。也就是创建一个不可被改变的变量。

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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: