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

JAVA中如何保证线程安全以及主键自增有序以及AtomicInteger简介

2015-01-26 09:20 686 查看
一、常见场景

多个线程针对一个i进行主键自增。多线程下如果不做安全策略,将会导致各个现成获取的i值重复,导致脏数据

常见策略

1、增加syschroize进行线程同步

2、使用lock、unlock处理

3、使用reetrantent 锁进行锁定

缺点:容易造成性能低下,或者编写代码容易造成死锁

二、新方案

jdk新提供的功能,atomicInteger(还有其他一atomic开头的原子性操作类)

AtomicInteger,一个提供原子操作的Integer的类。在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口。

原理:通过java的CAS compare and swap,简称cas原语进行操作提升性能,这个也号称乐观锁,不阻塞

观锁实际上并不加锁,当计算遇到冲突或者说前后不一致时会重试 直到成功

CAS有3个操作数 内存值V 要跟内存值做比较的值A 和 新值 B

[html] view
plaincopy





while(true){

if(V == A){

V = B;

return ;

}else{

A = V;

}

}

CAS的操作对象为volatile类型

volatile类型变量是:CPU直接读写变量所在的内存 而不是把变量copy到寄存器操作

这样对变量的操作所有线程都是可见的

这样做的结果是减少了并发时冲突的概率 但不能完全避免
原文链接:http://blog.csdn.net/kongqz/article/details/8948847
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐