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

Java 高效并发

2016-05-01 13:46 267 查看

并发

每秒事物处理数(TPS)

硬件的效率与缓存一致性



运算的时候将数据读取到缓存中,让其快速的运算,当运算结束后从缓存进行同步回内存

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操作,不推荐)

偏向锁(无竞争时去除锁,不推荐)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: