首页 > 代码库 > 线程安全
线程安全
在没有正确同步的情况下,如果多个线程访问同一个变量,程序就存在隐患。有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); }}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。