线程安全

在没有正确同步的情况下,如果多个线程访问同一个变量,程序就存在隐患。有3种方法修复它:

1. 不要跨线程共享变量;

2. 使变量变量变为不可变的;

3. 在任何访问变量的时候使用同步。

示例:

非线程安全的Servlet计算请求而没有必要的同步

public class UnsafeCountingFactorizer extends Servlet{
private long count = 0;

public long getCount(){
return count;
}

public void service(ServletRequest req,ServletResponse res){
BigInteger i = extractFromRequest(req);
BigInteger[] factors = factor(i);
++count;
encodeIntoResponse(res,factors);
}

}

  

UnsafeCountingFactorizer 是非线程安全的,它容易遗失更新(lost update),自增操作++count由于其紧凑的语法看上去像一个独立的原子操作,实际并非如此,++count不能作为一个独立的、不可分割的操作去执行。相反,自增操作是3个离散操作的简写形式:获得当前值,加1,写回新值。“读-改-写”(read-modify-write)的操作实例,其中,结果的状态衍生自它先前的状态。

 

使用原子变量来保证线程安全:

public class SafeCountingFactorizer extends Servlet{
	private final AtomicLong count = new AtomicLong(0);
	
	public long getCount(){
		return count.get();
	}
	
	public void service(ServletRequest req,ServletResponse res){
		BigInteger i = extractFromRequest(req);
		BigInteger[] factors = factor(i);
		count.incrementAndGet();
		encodeIntoResponse(res,factors);
	}
}

  

 
 

 

转载于:https://www.cnblogs.com/wx491592452/p/3796774.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值