Java 高效并发
2016-05-01 13:46
267 查看
并发
每秒事物处理数(TPS)硬件的效率与缓存一致性
![](http://www.myexception.cn/img/2014/10/25/182635640.jpg)
运算的时候将数据读取到缓存中,让其快速的运算,当运算结束后从缓存进行同步回内存
Java内存模型:
线程共享的变量储存在主内存,每个线程拥有自己的工作内存
注意:局部变量表的引用类型是线程私有的,但是引用指向的对象是线程共享的
volatile修饰符
保证变量可见性(保证在各个线程的工作内存中是一致的)不保证一致性(例如volatile变量a,a++不是原子操作,a++操作在栈顶进行,再写回工作内存,这里缺少同步操作)
保证此变量不出现指令重排
指令重排
flag=false .... .... flag=true .... while(flag){ .... }
指令重排出现的问题:究竟循环前面flag=true还是flag=false
并发特性
原子性:原子操作可见性:修改立即可见
有序性:线程内表现串行(线程外无序:指令重排,工作内存和主内存的同步延迟)
先行发生原则
操作A产生的结果会影响到操作B的观察,影响包括:修改共享内存的值,发送了消息,调用了方法等。a: i=1 b: j=i c: i=2
a与b操作存在先行发生原则
volatile和synchronized的区别:
volatile效率高,注意使用synchronized效率不如volatile
线程实现
使用内核线程(轻量级进程,用户态和核心态来回切换)使用用户线程(没有操作系统的支持,所有操作都需要程序处理)
使用用户线程+轻量级进程混合
Java线程实现
Liunx+Windows线程与轻量级进程一对一Java线程调度
协调式进程调度(主动让出cpu,容易由于程序的问题,一直不让出cpu,从而导致系统崩溃)抢占式进程调度(被强迫让出cpu)
Java线程五种状态
1. 新建(New)
2. 运行(Running)
3. 无限期等待(Waiting)
4. 限期等待(Timed Waiting)
5. 阻塞(Blocked)
6. 结束(Terminated)
线程安全
实现方式:1. 互斥同步(阻塞同步)synchronized(不公平)+ReentrantLock(可公平)
2. 非阻塞同步(原子操作:失败重试+CAS)
3. 无同步方案(可重入代码+线程本地储存Thread Lock Storage)
锁优化
自旋锁(时间一定)和自适应自旋锁(时间不一定)锁消除(依据变量逃逸情况,决定是否取消锁操作)
锁粗化(在一系列频繁的反复的上锁和解锁的操作时导致效率低的情况,将锁操作范围扩大)
轻量级锁(没有竞争的情况下,不使用传统锁,而是用轻量级锁,在没有竞争的情况下高,相反因为多一次CAS操作,不推荐)
偏向锁(无竞争时去除锁,不推荐)
相关文章推荐
- java中通过索引求数组中的最值
- 应该具备的调试技能(java)
- 最大公约数和最小公倍数--java实现
- java中notify,wait,sleep
- Uninstall JDK rpm to reinstall
- JAVA中获取数组中的最值
- Java反编译
- java里面4种关于xml的解析方法
- java.lang.Class.forName(String name, boolean initialize, ClassLoader loader)方法
- 关于springmvc的流程
- java.lang.Class.forName(String name, boolean initialize, ClassLoader loader)方法
- 使用CXF处理JavaBean式的复合类型和List集合类型的形参和返回值
- JAVA流程控制
- Java泛型
- 20145305 《Java程序设计》第9周学习总结
- Sun java认证考试真题答案及部分解析(三)
- Sun java认证考试真题答案及部分解析(二)
- Sun java认证考试真题答案及部分解析(一)
- 传智播客 2015 刘意 Java基础-视频-笔记day27(完结)(2016年5月1日12:53:07)
- SpringMVC 使用JSR-303进行校验