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

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

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

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值