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的更多相关文章

  1. 【Java并发系列01】Thread及ThreadGroup杂谈

    img { border: solid black 1px } 一.前言 最近开始学习Java并发编程,把学习过程记录下.估计不是那么系统,主要应该是Java API的介绍(不涉及最基础的概念介绍), ...

  2. Java并发编程(01):线程的创建方式,状态周期管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.并发编程简介 1.基础概念 程序 与计算机系统操作有关的计算机程序.规程.规则,以及可能有的文件.文档及数据. 进程 进程是计算机中的程序 ...

  3. Java并发基础01. 传统线程技术中创建线程的两种方式

    传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...

  4. Java:并发笔记-01

    Java:并发笔记-01 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 1. 进程与线程 本章内容 进程和线程的概念 并行和并发的概念 线程基本应用 1.1 ...

  5. 那些年读过的书《Java并发编程实战》和《Java并发编程的艺术》三、任务执行框架—Executor框架小结

    <Java并发编程实战>和<Java并发编程的艺术>           Executor框架小结 1.在线程中如何执行任务 (1)任务执行目标: 在正常负载情况下,服务器应用 ...

  6. Java并发编程实战 01并发编程的Bug源头

    摘要 编写正确的并发程序对我来说是一件极其困难的事情,由于知识不足,只知道synchronized这个修饰符进行同步. 本文为学习极客时间:Java并发编程实战 01的总结,文章取图也是来自于该文章 ...

  7. java并发编程小结

    旭日Follow_24 的CSDN 博客 ,全文地址请点击: https://blog.csdn.net/xuri24/article/details/82078467 线程简介: 线程是操作系统调度 ...

  8. Java并发指南1:并发基础与Java多线程

    本文转载自互联网,侵删 什么是并发 在过去单CPU时代,单任务在一个时间点只能执行单一程序.之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程.虽然并不是真正意义上的“同一时间点”,而是 ...

  9. 【Java并发004】原理层面:synchronized关键字全解析

    一.前言 synchronized关键字在需要原子性.可见性和有序性这三种特性的时候都可以作为其中一种解决方案,看起来是"万能"的.的确,大部分并发控制操作都能使用synchron ...

  10. Java并发编程:volatile关键字解析

    Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...

随机推荐

  1. Java-token生成

    1. 引入jar包 <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt< ...

  2. 5G智慧灯杆系统在智慧街区的应用

    智慧化的路灯作为一个高度集成的项目,是智慧城市在城市公共空间的落地载体,是一个自上而下的体系,有外延.可扩展.能适配智慧城市的建设要求.在商业街开展智慧灯杆建设,同期开展5G应用技术试点,有利于商业街 ...

  3. 使用python+poco+夜神模拟器进行自动化测试。

    https://blog.csdn.net/saint_228/article/details/84889017 网易最近出的一款自动化UI测试工具:Airtest 挺火的,还受到谷歌的推荐.我试着用 ...

  4. 关于vue模版动态加载按照指定条件

    一.在data中定义要作为模版的变量,当前定义了两个 menuNavigation 和menuDetails 二.模版使用方式使用component中的 用v-bind:is 来使用其参数

  5. Ubuntu16python3.5升级3.6apt-getupdate遇到403forbidden

    查了好多发现都不顶用 其实是因为jonathof的源停止对外开源了 真正解决问题的博客

  6. 机制设计原理与应用(三)Screening

    目录 3 Screening 3.1 为单个不可分割的项目定价 3.1.1 对\(\theta\)的假设 3.1.2 问题描述 3.1.3 特性 3.2 为无限可分的项目定价 3.2.1 对\(\th ...

  7. Bug的前后台分类及定位技巧

    必备工具:Firefox debug工具 一般浏览器F12即可   如何区分页面的bug问题归属:前端or后端 前端bug主要分为3个类别:HTML,CSS,Javascript三类问题 给个最大的区 ...

  8. JS笔记(二):数据类型

    镇楼图 Pixiv:torino 三.数据类型 原始类型 原始类型像是string.symbol.number之类的都只能存储原子值,而不能像对象一样随意扩展.但是为了提供额外功能,采取了轻量的对象包 ...

  9. obs问题记录

    1.安装obs后,可能无法使用,需要下载dll文件,我的阿里云盘中有: 2.录制时电脑没电会报错'编码器错误': 3.插上声卡后播放视频想听到声音需要在声卡上插耳机听: 4.

  10. Winform多线程访问UI控件问题

    Winform多线程无法访问UI控件,考虑使用委托方法解决.