首页 > 其他分享 >多线程

多线程

时间:2023-09-25 21:57:17浏览次数:39  
标签:接口 死锁 屏障 线程 内存 进程 多线程

首先先说一下什么是进程什么事线程,进程就是在内存中正在运行的程序,线程是进程的最小执行单位,一个进程最少得有一个线程,线程是指软件中的每一个功能。

     线程的创建方式有三种,继承Thread类,实现Runable接口,实现Callable接口,继承Thread类和实现Runable接口的区别在于,java是单继承的如果使用继承Thread的方法在线程链路特别长的时候会造成调用时长过长降低效率,是如果实现了Runable接口的话,则很容易的实现资源共享。实现Runable接口和实现Callable接口的区别在于,Runnable 接口 run 方法无返回值;Callable 接口 call 方法有返回 值,是个泛型, Runnable 接口 run 方法只能抛出运行时异常,且无法捕获处理; Callable 接口 call 方法允许抛出异常,可以获取异常信息。

      线程池的核心参数,核心线程数,最大线程数,阻塞队列,临时线程存活时间,存活单位,线程工厂,拒绝策略,拒绝策略分为:丢弃任务并抛出,丢弃任务,但是不抛出异常。如果线程队列已满,则后续提交的任务都会被丢弃,且是静默丢弃,丢弃队列最前面的任务,然后重新提交被拒绝的任务,由调用线程处理该任务。

       线程的工作流程,当有任务提交时,看是否达到核心线程数量?没达到,创建-个工作线程来执行任务。在看工作队列是否已满? 没满,则将新提交的任务存储在工作队列里。最后看是否达到线程池最大数量?没达到,则创建一个新的工作线程来执行任务最后,执行拒绝策略来处理这个任务。

       线程池的状态分为,新建,就绪,运行,阻塞,死亡,线程之间的通讯分为同步,异步,以及进程间的通讯,同步通讯可以使用jion,wait,notify,notifyall,和volatile关键字来进行,进程间的通讯就可以使用feign接口进行。

线程安全的特性,原子性一个线程操作是不能被其他线程打断,有序性线程在执行程序是有序的,可见性一个线程修改数据后,对其他线程是可见的,

volatile

       保证可见性,可以在一个线程修改了共享数据时对其他线程可见,其原理就是修改了变量副本值后及时同步到主内存,其他线程从主内存中获取

       保证有序性,会禁止指令重排,指令重排:Java代码翻译成class文件后,最终在JVM执行时,是把class翻译一个个的指令进行执行的。而CPU为了程序的执行性能,会对指令进行重新排序也就是说万一翻译后的指令是123,那么重排后的指令可能就是213。在多线程情况下,就会出现变量的可见性问题

       volatile是基于 内存屏障 来保证

有序性

                     内存屏障(也称内存栅栏,内存栅障,屏障指令等,是一类同步屏障指令,是CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作),避免代码重排序。内存屏障提供了避免重排序的功能

              可见性

                     内存屏障之前的所有写操作都要回写到主内存,内存屏障之后的所有读操作都能获得内存屏障之前的所有写操作的最新结果(实现了可见性)

                     内存屏障会把线程把工作内存中改变后的数据直接刷回主内存。其他线程就可以从主内存中获取最新数据

 

线程安全问题,也就是共享数据不安全

      

解决方案的话就是上锁,

              Synchronized 与 Lock 锁的区别

                            Synchronized

                                   JVM层面、是关键字

                                   出异常时会释放锁,不会出现死锁

                                   不会手动释放锁,只能等同步代码块或方法结束后释放锁

                            Lock

                                   API层面、是接口

                                   出异常时不会释放锁,会出现死锁,需要在finally中手动释放锁

                                   可以调用api手动释放锁

                     Synchronized

                            普通同步方法,锁是当前实例对象 this

                            静态同步方法,锁是当前类的class对象

                            同步代码块,锁是括号里面的对象【必须共享】

                            底层使用 monitorenter 和 monitorexit  指令实现的

              锁分类

                     悲观锁与乐观锁

                            悲观锁Synchronized,Lock,数据库的行锁、表锁也是悲观锁

                            乐观锁的典型代表就是cas,一般在数据库使用version字段用来解决乐观锁的数据不一致的情况。

              公平锁与非公平锁

                            公平锁:按线程顺序获得锁

                            非公平锁:线程随机获得锁

              死锁

                     死锁产生的原因

                            1、系统资源不足;

                            2、进程运行推进的次序不合适;

                            3、资源分配不当。

                            4、如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。

       死锁产生的原因及四个必要条件

              互斥条件:一个资源一次只能被一个进程访问。

              请求与保持: 一个进程因请求资源而阻塞时,对已获得的资源保持不放。

              不可剥夺:进程已获得的资源,在未使用完之前,不得强行剥夺。

              循环等待:若干进程之间形成一种头尾相接的循环等待资源关系

 

标签:接口,死锁,屏障,线程,内存,进程,多线程
From: https://www.cnblogs.com/szza/p/17728940.html

相关文章

  • 多线程
    学习多线程我们要先明白进程与线程进程就是在内存中正在运行的程序,就跟我们手机上一个个正在运行的软件一样.线程:线程是进程的最小执行单元,一个进程中最少拥有一个线程,线程就相当于手机软件中的一个个软件线程创建的方式(共四种)第一种是继承Thread类,重写run......
  • 多线程基本
    线程与进程得关系一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程线程则是计算机中最小执行单元.比如电脑管家这个软件就是一个进程而里面的杀毒清理垃圾全局守护这些功能就是一个个线程.一个进程最少拥有一个线程.线程的创建方......
  • HarmonyOS使用多线程并发能力开发
     一、多线程并发概述1、简介并发模型是用来实现不同应用场景中并发任务的编程模型,常见的并发模型分为基于内存共享的并发模型和基于消息通信的并发模型。Actor并发模型作为基于消息通信并发模型的典型代表,不需要开发者去面对锁带来的一系列复杂偶发的问题,同时并发度也相对......
  • 多线程实现实例-简单的聊天小程序TCP编程尝试
    运用TCP编程,实现一个从客户端到服务端多线程聊天的功能。 获取信息线程的代码Get.javapackagecom.xyq.HW;importjava.io.BufferedReader;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.net.Socket;publicclassGetextendsThread{......
  • 一文弄懂Java线程池 + Runnable多线程 + 调用WebService接口
    大家好,我是哪吒。一、需求很简单根据接口文档,调用第三方webservice接口,拼接入参,处理回参。RPC调用Webservice接口是一种远程调用的方式,通过指定Webservice接口的调用地址、命名空间、调用的方法名调用远程接口获取结果。二、解决方案通过ExecutorService新建线程池;定义thread类,请......
  • 1.多线程(实现方式,常用方法,生命周期)
    多线程(实现方式,常用方法,生命周期)概述:可以让程序同时做多件事情;可以提高效率;只要你想让多个事情同时运行就需要用到多线程;如: 软件中的耗时操作、所有的聊天软件、所有的服务器‘并发和并行:并发:在同一时刻,有多个指令在单个CPU上交替执行;并行:在同一时刻,有多......
  • 记一个多线程调用同一个函数引发的数据冲突问题
    main.py负责接收请求,异步起线程调用高度离散的B(a、b、c...).py类文件,B(a、b、c...).py类文件在执行结束后会统一调用C.py文件中的一个函数规范处理结果,C.py本来的用途是解耦提高代码复用,但在高并发情况下出现了数据冲突的问题。即只有B(a).py才会产生的结果给写进了只会调用B(b).......
  • 支付宝一面:多线程事务怎么回滚?说用 @Transactional 可以回去等通知了!
    背景介绍1,最近有一个大数据量插入的操作入库的业务场景,需要先做一些其他修改操作,然后在执行插入操作,由于插入数据可能会很多,用到多线程去拆分数据并行处理来提高响应时间,如果有一个线程执行失败,则全部回滚。2,在spring中可以使用@Transactional注解去控制事务,使出现异常时会进行......
  • 《探索C++多线程》:condition_variable源码(一)
    https://blog.csdn.net/hujingshuang/article/details/70596630    现在接着学习关于多线程编程的特征,在这一节,将会了解到多线程中的condition_variable(条件变量)的相关知识。     在头文件<condition_variable>中有两种条件变量的类声明与定义:condition_varia......
  • Python-多线程调用计算请求时间
    使用多线程调用某个方法(请求),计算每个线程消耗时间importthreadingimporttimeimportrequestsimportjsonimportconcurrent.futuresdefinput_req():url="https://xxxxxxxxxxxx"approval_content="nullain"payload=json.dumps({&quo......