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之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...
随机推荐
- Linux 服务器安全扫描
工具一:Nmap 1. 探测网络中活跃的主机 nmap -sP 10.0.105.1/24 :探测10.0.105网段中的全部主机 2. 探测主机系统版本 nmap -O IP :探测指定IP的相关数 ...
- NavicatPremium16破解!!!!!亲测可用!!!!!!!!!!!!!!!!!
前言 Navicat premium是一款数据库管理工具,是一个可多重连线资料库的管理工具,它可以让你以单一程式同时连线到 MySQL.SQLite.Oracle 及 PostgreSQL 资料库,让 ...
- [2009年NOIP普及组] 分数线划定
世博会志愿者的选拔工作正在A市如火如荼的进行.为了选拔最合适的人才,A市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试.面试分数线根据计划录取人数的150%划定,即如果计划录取m ...
- vue后台管理系统——权限管理模块
电商后台管理系统的功能--权限管理模块 1. 权限管理业务分析 通过权限管理模块控制不同的用户可以进行哪些操作,具体可以通过角色的方式进行控制,即每个用户分配一个特定的角色,角色包括不同的功能权限. ...
- 对象和类复习题(c++ prime plus )
第一题: 为复习题5描述的类提供方法定义,并编写一个小程序来演示所有的特性: bank.h #ifndef BACK_H_ #define BACK_H_ #include <string> ...
- js 导出json文件
var data={}//处理得到的json字符串 var filename = 'json.json'//json文件名 if(typeof data === 'object'){ ddd = JS ...
- react 前端导出Excel
1.首先下载 js-export-excel npm install js-export-excel; 2.下载 xlsx npm install xlsx; 3.引入 import * as ...
- C的基础常识
C是可移植性语言,因此可以在许多环境中使用,包括UNIX.Linux.MS-DOS.Windows和Macintosh OS. 使用C语言编写的内容的文本,称为源代码文件(source code fi ...
- 微信支付 easy wechat 使用
/*微信小程序的配置信息微信商户信息*/ public function __construct(){ parent::__construct(); $this->OrderModel = ne ...
- 说一说webpack的配置文件
可能有一些友友会奇怪为什么在写webpack的配置文件的时候,我们只能用commonJS导出. 原因:在打包的时候需要运行webpack的配置文件里面的代码,而webpack在打包运行的环境在node ...