Java并发小结01
Java并发小结01
主要参考自《实战Java高并发程序设计》。
需要知道的概念
- 同步与异步
- 并发与并行
- 临界区
- 阻塞与非阻塞
- 死锁、饥饿、活锁
同步与异步
同步:同步方法一旦被调用,必须等待方法返回后才能继续后续的行为。
异步:异步方法就像一个消息传递,被调用后方法会立即返回,调用者可以开始后续的行为。
并发与并行
并行:两个任务同时执行。
并发:一段时间内,多个任务在CPU交替执行,看似并行。
临界区
用来表示一种可以被多个线程使用的公共资源,但是一次只能一个线程使用。一旦临界区被占用,其他线程只能等待。
比如说打印机:一次只能打印一份文件,要是交替打印,那么打印出来的东西是不可用的。
阻塞与非阻塞
阻塞:一个线程占用了临界区资源,其他线程需要这个资源就得等待,等待会导致线程挂起,这就是阻塞。
非阻塞:与阻塞相反,没有一个线程可以导致其他线程阻塞,所有线程都不断尝试继续执行。
死锁、饥饿、活锁
死锁:两个或两个以上线程相互请求其他线程的资源,谁都执行不下去。
饥饿:一个线程因为种种原因一直获取不到需要的资源导致无法执行。
活锁:线程之间将资源相互推让而没有一个线程拿到资源继续执行。
并发级别
- 阻塞
- 无饥饿
- 无障碍
- 无锁
- 无等待
阻塞
使用synchronized关键字或重入锁,得到的就是阻塞的线程。
无饥饿
线程默认是不公平的(理论上优先满足优先级高的),会导致饥饿,公平锁解决饥饿问题。
无障碍
无障碍是一种最弱的非阻塞调度。两个线程如果无障碍地运行,那么不会因为临界区的问题导致一方被挂起。如果数据坏了就回滚,没有数据竞争就顺利完成工作,走出临界区。
无障碍有可能会因为数据冲突一直回滚,一种可行的无障碍实现可以依赖一个“一致性标记”来实现。
无锁
无锁的并行都是无障碍的。无锁的状态下,所有的线程都能尝试对临界区进行访问,不同的是,无锁的并发保证必然有一个线程能够在有限步内完成操作离开临界区。
会出现线程饥饿。
无锁的特点:可能会包含一个无穷循环。在这个循环中,线程会不断地尝试修改共享变量。如果没有冲突,修改成功,走人,否则继续尝试。
无等待
无锁只要求有一个线程在有限步内完成操作,而无等待则在无锁的基础上更近一步扩展。它要求所有线程都必须在有限步数内完成,这样就不会引起饥饿问题。
JMM
探讨一下java内存模型:原子性、可见性、有序性。
原子性:
一个操作是不可中断的。
可见性
一个线程修改了某个共享变量的值时,其他线程会立马知道这个修改。
有序性
程序在执行时,可能就进行指令排序,排序后的指令顺序与原指令顺序未必一致。
但是指令排序可以保证串行语义一致,不保证并行语义一致。
那些指令不能排序:Happen-Before原则
程序顺序原则:一个线程内保证语义的串行性。
volatile 原则:volatile变量的写先于读发生,这保证了volatile变量的可见性。
锁规则:解锁(unlock)必然发生在随后的加锁(lock)前面。
传递性:A先于B,B先于C,那么A先于C。
线程的start()方法先于它的每一个动作。
线程的中断(interrupt)先于被中断线程的代码。
对象的构造函数的执行、结束先于finalize()方法。
个人小结:
这些都是概念性问题,如果第一次不太熟悉可以baidu一下进行理解。
作为《实战Java高并发程序设计》的一章,主要介绍了并发的一些概念性关键词,建议深入理解,后面的多线程并发操作都建立在这些概念之上。
其中第一章有一个小结介绍有关并行的两个定律我忽略了,感兴趣的可以自己去看: Amdahl定律和Gustafson定律。
Java并发小结01的更多相关文章
- 【Java并发系列01】Thread及ThreadGroup杂谈
img { border: solid black 1px } 一.前言 最近开始学习Java并发编程,把学习过程记录下.估计不是那么系统,主要应该是Java API的介绍(不涉及最基础的概念介绍), ...
- Java并发编程(01):线程的创建方式,状态周期管理
本文源码:GitHub·点这里 || GitEE·点这里 一.并发编程简介 1.基础概念 程序 与计算机系统操作有关的计算机程序.规程.规则,以及可能有的文件.文档及数据. 进程 进程是计算机中的程序 ...
- Java并发基础01. 传统线程技术中创建线程的两种方式
传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...
- Java:并发笔记-01
Java:并发笔记-01 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 1. 进程与线程 本章内容 进程和线程的概念 并行和并发的概念 线程基本应用 1.1 ...
- 那些年读过的书《Java并发编程实战》和《Java并发编程的艺术》三、任务执行框架—Executor框架小结
<Java并发编程实战>和<Java并发编程的艺术> Executor框架小结 1.在线程中如何执行任务 (1)任务执行目标: 在正常负载情况下,服务器应用 ...
- Java并发编程实战 01并发编程的Bug源头
摘要 编写正确的并发程序对我来说是一件极其困难的事情,由于知识不足,只知道synchronized这个修饰符进行同步. 本文为学习极客时间:Java并发编程实战 01的总结,文章取图也是来自于该文章 ...
- java并发编程小结
旭日Follow_24 的CSDN 博客 ,全文地址请点击: https://blog.csdn.net/xuri24/article/details/82078467 线程简介: 线程是操作系统调度 ...
- Java并发指南1:并发基础与Java多线程
本文转载自互联网,侵删 什么是并发 在过去单CPU时代,单任务在一个时间点只能执行单一程序.之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程.虽然并不是真正意义上的“同一时间点”,而是 ...
- 【Java并发004】原理层面:synchronized关键字全解析
一.前言 synchronized关键字在需要原子性.可见性和有序性这三种特性的时候都可以作为其中一种解决方案,看起来是"万能"的.的确,大部分并发控制操作都能使用synchron ...
- Java并发编程:volatile关键字解析
Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...
随机推荐
- 整合mybatis实现简单的增删改查
mybatis配置相关代码 配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE conf ...
- hadoop单机测试环境安装(简)
1.下载hadoop官网就可以下载.可以直接搜hadoop , 其实可以直接查看官网的版主文档搭建https://hadoop.apache.org/docs/stable/hadoop-proj ...
- windows 安装配置mysql 8,以及远程连接访问
官网下载mysql8,https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.11-winx64.zip 1.解压zip包到安装目录 比如我的安 ...
- 前端使用JSEncrypt进行加密和解密
下载链接:https://www.bootcdn.cn/jsencrypt/ 使用方法: 1.引入jsencrypt 2.使用方法 // 加密公钥 const key = `xxxxxx`; func ...
- C# DataTable.Select()根据条件筛选数据
1.前言: 很多时候我们获取到一个表的时候需要根据表的包含的队列去筛选内容,一般来说可能想到的就是遍历整个表的内容进行条件筛选,但是这种方式增加了代码量且易出错,DataTable.Select()就 ...
- QPushButton与Enter相链接
ui->pushButton_login->setFocus(); // 设置默认焦点 ui->pushButton_login->setShortcut(QKeySequen ...
- gimp脚本.scm一些心得记录
gimp的脚本scm一些心得记录 GIMP 2.10 图像处理脚本推荐GIMP使用脚本使得图像处理的功能更加强大,对于一些常见操作可以通过脚本快速实现.GIMP也出来2.10版本了,比前面的2.8相比 ...
- vue、react配置gzip打包后,删除源文件deleteOriginalAssets: true,nginx需要的配置
1.删除源文件后,配置了gzip,当配置gzip删除源文件后,解决前端history问题,就会出现所有的都返回html,请求js.css也会返回html,页面会报错,如下配置即可 location / ...
- PLC入门笔记9
梯形图电路之电机控制 电机直接启动控制电路 电机正反停控制电路 我的图.. 但愿最后说的不要发生吧 例如下错了程序 导致... 最好外部电路互锁一下.. 电机故障判断电路 我的图.. 电机故障转换电路 ...
- 如何找到并使用makecert.exe
如果安装visual studio 后,visual studio command 仍然无法识别 makecert.exe 命令. 则需要手动安装 Windows Software Developm ...