Java基础之并发相关知识总结
作者:vcjmhg 发布时间:2022-04-24 13:59:05
一、Java并发是什么?
用学术定义来说就是
并发:同一时间段,多个任务都在执行 (单位时间内不一定同时执行);
简单来说就是,同一个时间段,让计算机同时做多个事情。
说到并发
,不得不提就是并行
:
并行:单位时间内,多个任务同时执行。
两者大眼一看很像,仔细一想却并不相同,因为并行
强调某个时间点多个任务同时执行,而并发
强调的是一个时间段内多个任务都在执行。
二、怎么做?
大部分并发问题,最终都可以抽象成三类问题分工、同步和互斥。而且针对不同的问题有着不同的方式来解决,具体如下图所示:
三、分工
所谓分工
,类似于现实中一个组织完成一个项目,项目经理要拆分任务,安排合适的成员去完成。
在并发编程领域,你就是项目经理,线程就是项目组成员。任务分解和分工对于项目成败非常关键,不过在并发领域里,分工更重要,它直接决定了并发程序的性能,并且分工非常重要且复杂,因而Java并发包中有一系列方法来实现分工
:
“Executor与线程池”
“ForkJoin”
“Future的使用”
基于分工思想设计的并发设计模式也有很多:
“Guarded Supension模式”
“Balking模式”
“Threa-Per-Message模式”
“生产者-消费者模式”
“Work Thread模式”
“两阶段终止模式”
四、同步
而同步
更多描述的是一种协同关系,在分完工之后,具体执行时,任务之间会有依赖,一个任务之后完成之后,其他依赖它的任务才能开始进行,因而就引入的同步
来协同各个任务之间的执行顺序。
针对该类问题,Java也提供了一系列工具来辅助解决:
“信号量(Semaphore)机制”
“管程(Monitor)”
“CountDownLatch”
“CyclicBarrier”
“Phaser”
“Exchanger”
五、互斥
分工、同步主要为了充分发掘CPU的性能来解决问题,但并发问题中,还需要解决正确性问题,即保证线程安全
。
当多个线程同时访同一个变量时,最后执行的结果是不确定的,比如下边这段代码:
public class UnsafeSequence {
private int value = 0;
public int getNext() {
return ++value;
}
}
如果我们有多个线程同时调用getNext()
时,多个线程之间推进顺序的不同可能会有不同的执行结果:
可能会是2,递推顺序如下:
可能结果是1,代码执行顺序如下:
因而结果是不确定的,也就是说结果可能是正确的(比如上边的程序执行结果为2),可能是错误的(比如执行结果是1),执行前是不知道的。而导致不确定的主要源头主要是三个问题可见性问题、有序性问题和原子性问题,为了解决这三个问题,Java引入了内存模型,内存模型提供一系列规则利用这些规则,我们可以避免可见性问题、有序性问题,但是还不足以完全解决线程安全问题。解决线程安全问题的核心方案还是互斥
。
所谓互斥,指的是同一时刻,只允许一个线程访问共享变量。
实现互斥主要手段是互斥锁主要包含下边这些手段:
Synchronized
Lock
读写锁
除此之外,未来提高速度,也有一些无锁的方案:
不变模式
线程本地存储
CAS
Copy - on - Write
原子类
六、总结
本文主要从分工、同步和互斥三类问题展开,从解决对应问题角度出发大致梳理了Java并发知识的学习前景图。后续将分若干部分来讲对应的内容。
来源:https://blog.csdn.net/Startapi/article/details/117229742


猜你喜欢
- 算数运算操作符重载在kotlin中我定义一个类data class Point(val x: Int, val y: Int)然后实例化两个
- 在jdk1.4中提出的技术,非阻塞IO,采用的是基于事件处理方式。传统的io技术为阻塞的,比如读一个文件,惹read方法是阻塞的,直到有数据
- 在upload.jsp页面中将多个文件域对象命名为相同的名字,这样在action中就可以将多个文件域解析成一个数组,数组的大小就是文件域的个
- 依赖 <dependency> <gro
- 一、JdbcTemplateSpring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作二、实战2.1 引
- 采取的方法是Fragment+FragmentTabHost组件来实现这种常见的app主页面的效果首先给出main.xml文件
- 昨天直接在机器上配置了Maven环境,今天顺便把Eclipse等IDE环境配置好。安装IDE Plugins的方法有很多。其一:在线安装,通
- Maven 多profile及指定编译要点项目A依赖项目B,项目A、B都有对应的多个profile,通过mvn –P参数指定profile,
- 在上篇文章给大家介绍了Android开发之开发者头条(一)启动页实现,感兴趣的朋友可以参考下。title: 带你实现开发者头条(二) 实现左
- 本文实例为大家分享了Android Studio实现补间动画的具体代码,供大家参考,具体内容如下补间动画是给出初始位置和结束位置,中间由系统
- 在开发Android应用程序中,经常会自定义View来实现各种各样炫酷的效果,在实现这吊炸天效果的同时,我们往往会定义很多attr属性,这样
- 一、using语句using可以算是.NET中新的语法元素,它清楚地说明一个通常比较占用资源的对象何时开始使用和何时被手动释放。当using
- 本文实例分析了Android多线程。分享给大家供大家参考,具体如下:在Android下面也有多线程的概念,在C/C++中,子线程可以是一个函
- 1、背景本系统调用外围系统接口(http+json),但是发现有时外围系统服务不太稳定,有时候会出现返回一串xml或者gateway bad
- final,static,this,super 关键字总结正文开始@Assassin1. final 关键字:final 关键字,意思是最终
- 本文实例为大家分享了Android实现随手指移动小球的具体代码,供大家参考,具体内容如下这个随手指移动小球,首先要使用paint画笔在can
- Android获取分享应用列表详解及实例如果在应用的AndroidManifest.xml中含有 ACTION_SEND 属性,那就证明该应
- makeCertPic.javapackage pic;import java.awt.Color;import java.awt.Font
- 第一种(java8):遍历JSONArray 拼接字符串public static void main(String[] args) {JS
- 背景在使用Spring Boot Mvc的项目中,使用Long类型作为id的类型,但是当前端使用Number类型接收Long类型数据时,由于