并发编程的一些基本概念

并发编程的三要素:

  • 原子性:一个或多个操作要么全部执行成功要么全部执行失败。
  • 可见性:一个线程对共享变量的修改,另一个线程能够立即看到。
  • 有序性:程序执行的顺序按照代码的先后顺序执行。

并发编程的优缺点:

优点:

  • 充分利用多核CPU的计算能力,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升。
  • 方便进行业务拆分,提高系统并发能力和性能。在特殊的业务场景下,先天就适合于并发编程。现在的系统动不动就要求百万级或者千万级的并发量,而多线程并发编程正是开发高并发系统的基础,利用好多线程机制可以大大提高系统整体的并发能力以及性能。面对复杂业务模型,并行程序会比串行程序更适应业务需求,而并发编程更吻合。

缺点:
并发编程的目的就是为了提高程序的执行效率,提高程序运行速度,但是并发编程并不总是能提高运行速度的,而且并发编程可能会遇到很多的问题,比如内存泄漏、上下文切换、线程安全、死锁等问题。

出现线程安全问题的原因及解决方法

  • 线程切换带来的原子性问题——JDK Atomic开头的原子类、synchronized、Lock可以解决原子问题。
  • 缓存导致的可见性问题——synchronized、volatile、Lock可以解决可见性问题。
  • 编译优化带来的有序性问题——Happens-Before规则可以解决有序性问题。

并发和并行有什么区别?

并发:多个任务在同一CPU核上,按细分的时间片轮流交替执行,从逻辑上来看哪些任务是同时执行的。
并行:单位时间内,多个处理器或多核处理器同时处理多个任务,真正的“同时进行”。

多线程的概念和优缺点

多线程:程序中包含多个执行流,挤在一个程序中可以同时运行多个不同的线程来执行不同的任务。
优点:提高CPU的利用率。
缺点:

  • 线程也是程序,所以线程需要占用内存,线程越多,占用内存也越多。
  • 多线程需要协调和管理,所以需要CPU时间跟踪线程。
  • 线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题。

线程和进程的定义:

进程: 一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程。
线程: 进程中的一个执行任务(控制单元),负责当前进程中程序的执行。

线程和进程的区别:

根本区别: 进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位。
资源开销: 每个进程都有独立的代码和数据空间(程序上下文),床徐志坚的切换会有较大的开销;现场可以看作轻量级的进程,同一类的现场共享代码和数据空间,每一个线程都有自己独立的运行核和程序计数器,线程之间的开销小。
包含关系: 如果一个进程内有多个线程,则执行过程不是一条线的,而是多线程共同完成的,线程是进程的一部分。
内存分配: 同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的。
影响关系: 一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程比多线程健壮。

线程死锁的概念
死锁是指两个或者两个以上的进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(线程)称为死锁进程(线程)。

如下图所示,线程A和B进入死锁状态。
在这里插入图片描述

形成死锁的四个必要条件:

  1. 互斥条件:线程对于所分配到的资源具有排它性,即一个资源只能被一个线程占用,直到被该线程释放。
  2. 请求保持条件:一个线程因请求被占用资源而发生阻塞时,对获得的资源保持不变。
  3. 不剥夺条件:线程已获得的资源在未使用之前被其他线程强行剥夺,只有自己使用完毕后才释放资源。
  4. 循环等待条件:当发生死锁时,所等待的线程必定会形成一个环路,造成永久阻塞。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值