java-如何以及为什么此代码是线程安全的.
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-如何以及为什么此代码是线程安全的.,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1453字,纯文字阅读大概需要3分钟。
内容图文
![java-如何以及为什么此代码是线程安全的.](/upload/InfoBanner/zyjiaocheng/674/bf3c5ce84356427f8ff42e1dc69a9feb.jpg)
这是我的代码.
@immutable // This is not a standard annotation .Only for Showing that behavior of Class
class OneValueCached{
private final BigInteger lastNumber;
private final BigInteger[] lastFactors;
public OneValueCached(BigInteger i,BigInteger[] factors){
lastNumber=i;
lastFactors=Arrays.copyOf(factors, factors.length);
}
public BigInteger[] getFactors(BigInteger i){
if(lastNumber==null || !lastNumber.equals(i))
return null;
else
return Arrays.copyOf(lastFactors, lastFactors.length);
}
}
@threadSafe // This is not a standard annotation .Only for Showing that behavior of Class
public class VolatileCachedFactorizer implements Servlet{
private volatile OneValueCached cache=new OneValueCached(null, null);
public void service(ServletRequest req, ServletResponce resp){
BigInteger i= extractFromRequest(req);
BigInteger[] factors=cache.getFactors(i);
if(factors==null){ // ---> line 1
factors=factor(i); // --> line 2
cache=new OneValueCached(i, factors);
}
encodeIntoResponse(resp,factors);
}
}
为什么类VolatileCachedFactorizer根据Book是线程,但我的意思是..
1. @第1行,如果第1个线程在第2行挂起并且发现factor = null时,第2个线程同时到达第1个线程检查条件并发现factor = null,则第2个线程也在同一时间检查相同条件
并且两者都将创建新的OneValueCached对象,然后此代码如何是线程安全的.
谢谢
解决方法:
这是线程安全的,因为lastNumber和lastFactors之间永远不会存在不一致的情况,而这可能会导致错误的分解.它不能保证将发生最少数量的分解:OneValueCached可以创建一次以上,但这仍然是线程安全的.
内容总结
以上是互联网集市为您收集整理的java-如何以及为什么此代码是线程安全的.全部内容,希望文章能够帮你解决java-如何以及为什么此代码是线程安全的.所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。