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高并发程序设计——学习摘要-第二章
- 《Java高并发程序设计》学习 --5.1 探讨单例模式
- java高并发程序设计学习笔记一前言
- 《Java高并发程序设计》学习 --5.8 并行排序
- effect java 学习摘要(7) - 通用程序设计 和 异常
- java高并发程序设计学习笔记九锁的优化和注意事项
- java高并发程序设计学习笔记三内存模型线程安全
- JAVA高并发程序设计学习:Synchronized同步代码块具体使用方法
- effect java 学习摘要(8) - 并发
- java高并发程序设计学习笔记五六JDK并发包
- java高并发程序设计学习笔记八BIO、NIO和AIO
- java高并发程序设计学习笔记四无锁
- java高并发程序设计学习笔记二多线程基础
- 《Java高并发程序设计》学习 --6.5 增强的Future:CompletableFuture
- 《Java高并发程序设计》学习 --3.3 JDK的并发容器
- Java核心技术学习笔记—— 卷一 第一章:Java程序设计概述
- Java 高并发程序设计学习笔记--wait 和notify
- Java线程学习笔记之并发集合类
- Java学习笔记-Java程序设计环境(Windows)
- JAVA并发实践学习