• 多线程的一些基本理念!


    1.进程和线程

    进程:系统进行资源分配和调度的独立单位,每一个进程都有它自己的内存空间和系统资源。

    进程实现多处理机环境下的进程调度分派,切换时,都需要花费较大的时间和空间开销。

    通俗话:为了提高系统的执行效率,减少处理机的空转时间和调度切换的时间,以及便于系统管

    理,所以有了线程,线程取代了进程了调度的基本功能。


    简单来说,进程作为资源分配的基本单位,线程作为资源调度的基本单位。

    2.使用多线程的目的

    使用多线程最主要的原因是提高系统的资源利用率
    (现在CPU基本都是多核的,如果你只用单线程,那就是只用到了一个核心,其他的核心就相当于空闲在那里了)

     

    比如说,我们系统Web服务器用的是Tomcat,Tomcat处理每一个请求都会从线程连接池里边用一个线程去处理。


    又比如说,我们用连接数据库会用对应的连接池 Druid/C3PO/DBCP等等。

    3.线程安全

    我个人解决线程安全问题的思路有以下:

    1. 能不能保证操作的原子性,考虑atomic包下的类够不够我们使用。
    2. 能不能保证操作的可见性,考虑volatile关键字够不够我们使用
    3. 如果涉及到对线程的控制 (比如一次能使用多少个线程,当前线程触发的条件是否依赖其他线程的结果),考虑CountDownLatch/Semaphore等等
    4. 如果是集合,考虑iava.util.concurrent包下的集合类
    5. 如果synchronized无法满足,考虑lock包下的类

    4.死锁解决

    原因: 当前线程拥有其他线程需要的资源,当前线程等待其他线程已拥有的资源,都不放弃自己拥有的资源。

    避免死锁的方式一般有以下方案:

    1. 固定加锁的顺序,比如我们可以使用Hash值的大小来确定加锁的先后。
    2. 尽可能缩减加锁的范围,等到操作共享变量的时候才加锁。
    3. 使用可释放的定时锁。(一段时间申请不到锁的权限了,直接释放掉)
  • 相关阅读:
    【Python深度学习】深度学习中框架和模型的区别
    Spring Cloud Alibaba x AppActive 带来的全新异地活动解决方案
    接口自动化测试详解(文档)
    洛谷 P8741 [蓝桥杯 2021 省 B] 填空问题 题解
    QFluentWidgets: 基于 C++ Qt 的 Fluent Design 组件库
    Ubuntu Linux client L2TP
    Oracle笔记-对ROWNUM的一次理解(简单分页)
    科研 | 研究成果该如何署名?
    Uni-App常用事件
    基于原子势函数及人工蜂群算法进行形状匹配优化(Matlab代码实现)
  • 原文地址:https://blog.csdn.net/kologin/article/details/134450483