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

Java高并发程序设计——学习摘要-第一章

2016-09-26 12:36 239 查看

何去何从的并行计算

一般的情况下并行并不是一个很好的例子,但是在服务端程序或者图形学程序下,并行是个不错的选择。原因是服务端程序是拥有复杂的业务逻辑时,并发是个不错的选择。

就硬件领域的单核CPU而言,摩尔定律已经失效,单核CPU的性能已经到了瓶颈,因此多核CPU就大行其道,因此未来充分发挥CPU性能,就要求程序开发人员具备一定程度的并发开发能力。

而因此如何使用并保证让多个cpu有效并正确的工作就成为了一门艺术。

并发的几个概念

同步:同步方法调用一旦开始,调用者必须等到方法调用返回后才可以进行其他操作。

异步:异步方法一旦开始就会立即返回,其内容会在另一个线程中“真实”的执行,整个过程不会妨碍调用者工作。

并发:一段时间内多个任务执行。

并行:一个时间点多个任务执行。

临界区:一种公共资源但是每次只能有一个线程使用。

阻塞:一个线程使用了临界资源,则其他线程如果使用则需等待。

死锁:多个线程相互请求已被占用的临界资源,从而导致都推进不下去。

饥饿:线程因为种种原因无法获得所需的资源,导致一直无法执行。

活锁:多个线程都将临界资源释放给其他线程使用,导致资源不断在线程中跳动,没有一个能够执行。

并发级别

并发级别大致上分为:阻塞、无饥饿、无障碍、无锁、无等待。

并行的两个公式

串行比F=串行代码/总代码

amdahl公式:加速比=1(F+(1−F)/N)

说明串行比越低,处理器越高,加速效果越好。

Gustafson 公式

加速比=N−F(N
b989
−1)

Java并发:JMM

JMM:Java的内存模型。

JMM的关键技术点都是围绕多线程的原子性、可见性、有序性来建立的

原子性(Atomicity)

原子性是指一个操作是不可中断的。

显示多线程下没有原子性造成的数据错误

对于long型数据由于是64位,在32位系统中如果多线程读写,如果没有原子性就会出问题。

public class AtomicityTest {
public static long t=0L;
public static long t1=111L;
public static long t2=-999L;
public static long t3=333L;
public static long t4=-444L;

public static class ChangeT implements Runnable{
private long to;

public ChangeT( long to){
this.to=to;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
AtomicityTest.t=to;
Thread.yield();
}

}
}
public static class ReadT implements Runnable{

@Override
public void run() {
// TODO Auto-generated method stub
long tmp=0;
while(true){
tmp = AtomicityTest.t;
if(tmp!=t1&&tmp!=t2&&tmp!=t3&&tmp!=t4){
System.out.println("原子性问题:"+tmp);
}
}
}

}
public static void main(String[] args){
new Thread(new ChangeT(t1)).start();
new Thread(new ChangeT(t2)).start();
new Thread(new ChangeT(t3)).start();
new Thread(new ReadT()).start();
}
}


可见性(Visibility)

可见性是指当一个线程修改了某一共享变量的值,其他线程是否立刻知道这个修改。

可见性是个综合问题,缓存优化\硬件优化(内存对象可能不会立即触发而是会进入硬件队列中)、指令重排也会和编译器优化都会造成一个线程的修改不会立刻被其他线程察觉。

具体原因是因为在多线程过程中,不同线程的对公共量的读写步骤的执行顺序可能不一致,尤其是对于多核多线程的CPU。

个人理解

具体原因是因为在多线程过程中,不同线程的对公共量的读写步骤的执行顺序可能不一致,尤其是对于多核多线程的CPU。

有序性(Ordering)

有序性的问题原因是:线程在执行过程中,可能会进行指令重排,而指令重排后指令与原指令的顺序未必一致。

指令重排的目的是提高CPU执行的效率,减少中断。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 并发 摘要 学习