ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

《Java高并发程序设计》读书笔记一

2019-02-26 16:53:56  阅读:390  来源: 互联网

标签:Java 读书笔记 并发 线程 内存 操作 串行 先于 并发程序


第一章 走入并行世界

1、基本概念

  • 同步:同步方法一旦开始,调用者必须等到方法调用返回后,才能继续后续操作
  • 异步:一旦开始,方法调用就会立即返回,调用就可以继续后续操作
  • 并发:表示两个或者多个任务一起执行,偏重于任务交替执行,而多个任务之间还是串行的
  • 并行:真正意义的同时进行
  • 临界区:一种公共资源或者说是共享数据,可以被多个线程使用,但是一次只能一个线程使用
  • 阻塞:等待其他线程释放资源
  • 死锁:都不让出资源
  • 活锁:都让出资源
  • 饥饿:无法获取所需资源

2、并发级别

  • 阻塞:当使用synchronized关键字或者重入锁时,我们得到的就是阻塞线程,在其他线程释放资源之前当前线程都无法执行。
  • 无饥饿:对于非公平锁来说线程调度倾向于满足高优先级的线程,可能导致低优先级的线程处于饥饿状态。
  • 无障碍:不加锁,都进入临界区,数据不一致 回滚。
  • 无锁:无障碍基础上要求 必然有一个线程能够在有限步内完成操作离开临界区 ,compareAndSet。
  • 无等待:要求所有的线程都必须在有限步内完成 ,一种典型的无等待结构就是RCU(Read-Copy-Update),读不加以控制,写修改副本,在合适的时机写回数据。

3、两个重要定律

Amdahl定律:加速比 = 优化前系统耗时 / 优化后的系统耗时,当处理器个数趋向与无穷大时,加速比和串行比例成反比。CPU数量越多,串行比列越小,则优化效果越好。当串行比列y

 Gustafson定律:如果可被并行化的代码所占比重够多,则加速比就能和处理器个数成线性增长。

4、Java的内存模型

  • Java内存模型是围绕着并发编程中原子性、可见性、有序性这三个特征来建立的。
  • 原子性:指一个操作是不可中断的,即使是在多线程一起执行的时候,操作一旦开始就不会被打断。在32位JVM中,64位的long数据的读和写都不是原子操作。
  • 可见性:当一个线程修改了某个共享变量的值,其他线程能够知道这个修改。
  • 有序性:在多线程并发时,程序的执行就有可能出现乱序。在本线程内观察,操作都是有序的;如果在一个线程中观察另外一个线程,所有的操作都是无序的。前半句是指“线程内表现为串行语义(WithIn Thread As-if-Serial Semantics)”,后半句是指“指令重排”现象和“工作内存和主内存同步延迟”现象。

5、Happend-Before规则

  • 程序顺序原则:一个线程内保证语义的串行性
  • volatile规则:volatile变量的写先于读
  • 锁规则:解锁在之后的加锁前
  • 传递性:A先于B,B先于C,则A必然在C前
  • 线程的start()方法先于它的其他动作
  • 线程的所有操作先于终结
  • 线程的中断先于被中断的代码
  • 对象的构造函数执行、结束先于finalize()方法

标签:Java,读书笔记,并发,线程,内存,操作,串行,先于,并发程序
来源: https://www.cnblogs.com/AmyZheng/p/10433409.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有