第一章 走入并行世界

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()方法

转载请于明显处标明出处

https://www.cnblogs.com/AmyZheng/p/10433409.html

《实战Java高并发程序设计》读书笔记一的更多相关文章

  1. 【鸟哥的Linux私房菜】笔记1

    Linux是什么 从操作系统与cpu架构关系到linux  Richard Mathew Stallman GPL 关于GNU计划 Linux的发展 Linux的核心版本 Linux的特色 Linux ...

  2. 【鸟哥的Linux私房菜】笔记3

    正确地开机 最好不要使用root账号登陆!GNOME图形界面 View items as a list X WindowShell 文本交互界面bash是Shell的名称,Linux的默认壳程序就是b ...

  3. 【鸟哥的Linux私房菜】笔记2

    Linux的应用 学习资源整理 安装记录 >< 1.Linux的应用: 网络服务器 数据库 学术机构的高效运算任务 嵌入式系统 ... 2.挂载与磁盘分区 学习资源整理 学习 1.书上的网 ...

  4. 《鸟哥的Linux私房菜》笔记——02. 关于Linux

    Unix 历史 1969年以前:伟大的梦想--Bell, MIT 与 GE 的「Multics」系统 1969年:Ken Thompson 的小型 file server system 1973年:U ...

  5. 《鸟哥的Linux私房菜》笔记——03. 磁盘分区

    Everything is a file. 常见硬件对应于 Linux 下的文件(/dev目录下) 装置 装置在Linux内的档名 SCSI/SATA/U盘硬盘机 /dev/sd[a-p] U盘 /d ...

  6. 鸟哥的linux私房菜学习笔记 __ 命令与文件的搜寻

    连续输入两次[tab]按键就能够知道使用者有多少命令可以下达.那你知不知道这些命令的完整档名放在哪里?举例来说,ls 这个常用的命令放在哪里呢? 就透过 which 或 type 来找寻吧! 范例一: ...

  7. 【鸟哥的Linux私房菜】笔记

    操作系统核心的功能! 驱动程序与操作系统的关系 2. [计算机组成之组件] 3.CPU实际要处理的数据完全来自于主存储器,这是一个很重要的概念! 4.CPU是整个计算机系统最重要的部分,那么目前世界上 ...

  8. 《鸟哥的Linux私房菜》笔记——04. 简单命令行

    键入命令 [dmtsai@study ~]$ command [-options] parameter1 parameter2 ... 指令 選項 參數(1) 參數(2) 注意:有时也可以使用 + 放 ...

  9. 鸟哥的Linux私房菜学习笔记——文件权限与目录配置

    Linux的文件权限和目录配置 在linux中的每个用户必需属于一个组,不能独立于组外.在linux中每个文件有所有者.所在组.其它组的概念. (1)所有者 一般为文件的创建者,谁创建了该文件,就是天 ...

  10. 鸟哥的Linux私房菜学习笔记(1)

    2014/10/29 1.档案的权限管理分为三个部分: 拥有者.群组.其他 2.ls -al 命令可以看到档案的详细信息 3.档案的属性中由十个部分构成 第一个部分是档案类型 -代表档案.d代表文件夹 ...

随机推荐

  1. office2019与Visio2016不能共存解决办法

    我们电脑已经安装office2019,可是安装visio2016就会安装不了.只要两个软件同时安装就可以解决了,简单粗暴. 首先把电脑的offic或者visio都卸载了,删除干净. 然后先打开visi ...

  2. 记录 shell学习过程(6)while 以及 while的嵌套 以及 until

    while中的5种条件 1.数学比较 read -p "Num :" num1 ] do echo 'greater' sleep done 2.字符串比较 read -p &qu ...

  3. 【C语言】输入一个整数x并判断x是否存在于数组a中

    #include<stdio.h> int main() { ] = { ,,,,,,,, };//数组初始化 printf("请输入要查找的数据:\n"); scan ...

  4. Mac升级后如何查看自己的网络端口

    OS X 10.9 下面 网络实用工具 从实用工具目录里消失了,可能这个程序用的人太少就取消了吧.但是对于做互联网的人还是有点用的. 参考http://www.mamicode.com/info-de ...

  5. python3爬取百度知道的问答并存入数据库(MySQL)

    一.链接分析: 以"Linux"为搜索的关键字为例: 首页的链接为:https://zhidao.baidu.com/search?lm=0&rn=10&pn=0& ...

  6. MYSQL之路练习题

    题目换成求平均薪水的等级最高的部门的部门名称

  7. List数组排序

    import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.u ...

  8. HDU4714 Tree2cycle 解题报告

    题意 给定一棵无根树,删除或连接一条边的代价为\(1\),求把树变为环的最小代价. 前置思路 如果删除了\(k\)条边,使得树变成\((k+1)\)条链,再用\((k+1)\)次连接操作把树变成一个环 ...

  9. ansible笔记(8):初识ansible playbook

    回顾总结:我们来想象一个工作场景,看看怎样把之前的知识点应用到这个工作场景中.假设,我们想要在192.168.10.2主机上安装nginx并启动,我们可以在ansible控制主机中执行如下3条命令. ...

  10. 【vue】 router.beforeEach

    import store from '@/store' const Vue = require('vue') const Router = require('vue-router') Vue.use( ...