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
多个线程针对一个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
相关文章推荐
- JAVA中如何保证线程安全以及主键自增有序
- JAVA中如何保证线程安全以及主键自增有序
- 【Java之Servlet(二)】servlet是单例多线程,以及多线程下如何保证线程安全
- 在Java如何保证方法是线程安全的
- 2015我想和Java聊聊之StringBuffer是如何保证线程安全的
- AtomicInteger如何保证线程安全以及乐观锁/悲观锁的概念
- java 中的经典算法 如何将有序数据打散,以及在数组中取数据如何做到结果不重复。
- 在 Java 的多线程中,如何去判断给定的一个类是否是线程安全的(另外:synchronized 同步是否就一定能保证该类是线程安全的。)
- Java多线程-线程安全思路拓展-Atomic数值类-Volatile以及CAS乐观锁
- 在 Java 的多线程中,如何去判断给定的一个类是否是线程安全的(另外:synchronized 同步是否就一定能保证该类是线程安全的。)
- Java多线程有哪几种实现方式? Java中的类如何保证线程安全? 请说明ThreadLocal的用法和适用场景
- java 中的经典算法 如何将有序数据打散,以及在数组中取数据如何做到结果不重复。
- 【java】线程安全的整型类AtomicInteger
- Servelt是否线程安全以及如何保证线程安全
- java基础—如何创建线程?如何保证线程安全?
- Java多线程有哪几种实现方式? Java中的类如何保证线程安全? 请说明ThreadLocal的用法和适用场景
- java如何保证线程安全
- java中的字符串简介,字符串的优化以及如何高效率的使用字符串
- Java 基础 ——AtomicInteger( 线程安全)
- 拿来主义:java中的线程安全与非线程安全,以及如何使用和实现