

对于多线程和多进程和多线程的区别的一些题,网上众说纷纭,小编为你带来详细的讲解。
Java多线程
1进程和线程
11道工序
111进程是程序的执行,是具有独立功能的程序及其数据在处理器上顺序执行的活动。112进程是系统中进行资源分配和调度的独立单位。每个进程都有独立的内存空间和系统资源。113进程程序运行时,会有空间,内存会分配一个地址。该过程用于定义空间。标识空间,用于封装控制单元。114一个进程崩溃后,不会影响其他处于保护模式的进程。
12线程
121线程是进程的执行路径。一个进程中至少有一个线程。122线程是进程中的控制单元,控制进程的执行。123线程是CPU分配资源的基本最小单位。124线程有自己的堆栈和局部变量。但线程之间没有单独的地址空间。一个线程的死亡相当于整个进程的死亡。
13进程和线程的区别
131一个进程中有多个线程。多个线程共享进程的堆和方法区资源,但每个线程都有自己的程序计数器和堆栈区。132Java虚拟机启动时,会有一个进程javaexe。该进程中至少有一个线程负责运行Java程序。该线程的代码存在于main.c中。该线程称为主线程。辅助线程-例如垃圾收集
14多线程的含义
141启动线程的目的是运行指定的代码;
2相关知识
21程序计数器是用来记录线程当前要执行的指令地址的内存区域。22堆是进程中最大的一块内存。堆由进程中的所有线程共享。23堆栈用于存储线程的局部变量。这些局部变量是线程私有的。另外,它还用来存储线程的调用栈帧。24方法区用于存储JVM加载的类、常量和静态变量等信息,也是线程共享的。
3并发与并行
31并发并发
第311章时间段
3111表示同一时间段内有多个任务同时执行,且没有一个任务执行完成。312并发任务强调在一个时间段内同时执行。多个线程在单个核心上运行。一个线程在同一时间点运行。系统不断切换线程。单位时间内不能同时执行多个并发任务。
313并发常见题解
3131共享内存不可见题
314隐喻
3141吃到一半,接到电话。你停下来接电话。回完后,你继续吃饭。315在并发中,两件事同时发生。是并行还是串行?看看银联。单核是串行,多核是串行。平行线
32并联
321并行性是不同实体上的多个事件。
322个时间点
3221表示单位时间内同时执行多个任务。323每个线程分配一个独立的核心,线程同时运行
第324章并排
3241吃饭吃到一半的时候,电话打来了。你一边吃饭一边打电话。
33系列
331在多线程程序中,如果一个线程运行过程中使用了另一个线程的运行结果,则可以将该线程串行化。332多个任务,执行完后执行另一个任务
333隐喻
3331吃饭时接到电话,吃完才接听34在多线程编程的实践中,线程的数量往往比CPU的数量还多,因此一般称为多线程并发编程,而不是多线程并行编程。
4线程安全
41线程安全题
为什么会出现线程安全题?计算机执行程序时,每条指令都是在CPU中执行的,执行指令的过程涉及到数据的读写。由于程序运行过程中的临时数据是保存在主存中的,所以这时候就出现了题。由于CPU执行速度非常快,从内存读取数据和向内存写入数据的过程与CPU执行指令的速度是不同的。比这要慢很多,所以如果任何时候都必须通过与内存交互来进行数据的操作,就会大大降低指令执行的速度。为了处理这个题,CPU中就有了缓存的概念。程序运行时,计算所需的数据会从主存复制到CPU的缓存中。然后CPU在执行计算时可以直接从其缓存中读取数据并向其写入数据。操作完成后,将缓存中的数据刷新到主存中。CPU处理主存-->缓存--CPU处理数据--缓存-->>主存储器
如果线程操作的数据在缓存中,那么多个线程从主存复制的共享数据是相同的,处理结果是不同的。当数据返回主存时会出现安全题。
42synchronized的内存语义
synchronized同步这种内存语义可以解决共享变量内存可见性的题。进入同步块的内存语义是从线程的工作内存中清除同步块中使用的变量。这样,在synchronized块中使用该变量时,就不会从线程的工作内存中获取,而是直接从主线程中获取。从记忆中检索出来。
退出同步块的内存语义是将同步块内共享变量的修改刷新到主内存。会导致上下文切换开销、排它锁、并发性降低。
43对易失性的理解
易失性该关键字确保变量的更新对其他线程立即可见。当变量被声明为易失性时,线程在写入变量时不会将值缓存在寄存器或其他地方,而是将值刷新回主内存。当其他线程读取共享变量时,将从主内存中检索最新值,而不是使用当前线程工作内存中的值。
易失性的内存语义与同步的类似。具体来说,当一个线程写入一个Volatile变量值时,相当于该线程退出了Synchronized同步块,而当读取一个Volatile变量值时,相当于进入了Synchronized块。不保证原子性。
5个经典题
pubicclassSellStationImplementRunnablecatchExceptione//获取当前正在进行的线程的名称SystemoutprintlnThreadcurrentThreadgetName+34;+ticket+34;-;publicstaticvoidmainstring[]args抛出异常
51出现的题
通过分析发现,打印了0、-1、-2等错误的选。多线程操作存在安全题。注意多线程的安全题
题原因当多条语句操作同一个线程共享数据时,一个线程只执行多条语句的一部分。在执行完成之前,另一个线程参与执行,导致共享数据错误。
解决方案对于多个操作共享数据的语句,只有一个线程可以完成执行。执行过程中,其他线程不能参与执行。
Java为多线程安全题提供了专业的解决方案。这是一个同步代码块。synchronized同步锁,线程进入synchronized代码块,首先改变标志位,阻止其他进程运行,执行synchronized代码块中的内容,然后改变标志位Sharedpoollock,monitor对象就像一把锁。持有锁的线程可以同步执行。不持有锁的线程即使获得了CPU的执行权,也因为没有获得锁而无法进入。
同步的前提条件1、必须有两个或多个线程。2.多个线程必须使用同一个锁。3必须保证同步时只能有一个线程在运行。
好处解决多线程安全题。缺点需要多个线程判断锁,比较消耗资源
如何发现题1、明确哪些代码是多线程运行的代码。2.明确共享数据。3、明确多线程运行代码中哪些语句操作共享数据。
同步有两种表现形式1同步代码块2Synchronized关键字作为修饰符,修饰函数,使其具有同步特性。注意哪些语句需要同步。
同步功能使用哪个锁?函数需要被对象调用。然后该函数有一个所属对象引用。就是这个。所以同步函数使用的锁就是这个。
如果synchronized函数被静态修改,使用什么锁?经过核实,发现已经不是这个了。因为这不能在静态方法中定义。
静态进入内存时,内存中没有该类的对象,但一定有该类对应的字节码文件对象。类名该对象的类型是Class。同步对象是类名,是静态同步方法。使用的锁是该方法所在类的字节码文件对象,类名是class。
6僵局
61锁的特点
第611章互斥
6111互斥允许同一时间只有一个线程持有特定的锁,因此这一特性可用于实现共享数据的协调访协议。6112这样一来,同一时间只有一个线程可以使用共享数据。
612能见度
6121必须确保释放锁之前对共享数据所做的更改对于随后获取锁的另一个线程是可见的。
62种锁
621可重入锁
6211可重入锁又称为递归锁,是指同一个线程在外层方法中获取锁时,进入内层方法时会自动获取锁。
第622章公平锁
6221公平锁是指多个线程按照申请锁的顺序获取锁。
623不公平锁
6231非公平锁是指多个线程获取锁的顺序与申请锁的顺序不同。稍后申请的线程可能会先于先申请的线程获得锁。
63Java多线程加锁机制
631同步632显式锁定
64死锁的四个必要条件
第641章互斥条件
6411资源不能共享,只能被同一进程使用。
第642章请求和保留条件
6421已获取资源的进程可以申请新资源。
第643章非剥夺条件
6431分配的资源无法从相应进程获取,被强行剥夺。
644循环等待条件
6441系统中多个进程形成循环。循环中的每个进程都在等待相邻进程占用的资源。
处理死锁的65种方法
651-忽略这个题,又名鸵鸟算法。当出现题时,跳过它,忽略它;652-检测死锁并恢复;653-动态分配资源;654-打破上述四个死锁条件之一。
7线程池
71个概念
711线程池本质上是一个用于管理线程资源的对象池。任务执行之前,需要从线程池中取出一个线程来执行。任务执行完成后,需要将线程返回到线程池中。
72使用线程池的目的
721复用线程池中的线程,避免线程创建和销毁锁带来的性能开销722减少资源消耗。线程本身就是一种资源。创建和销毁线程都会造成CPU开销;创建的线程也会占用一定的内存。线程池可用于统一分配、调优和监控。723提高任务执行的响应速度。执行任务时,不必等到线程创建后再执行。73使用Executors工厂类生成线程池。74使用Java8增强的ForkJoinPool生成线程池。
8线程通讯
81借助Object类的wait、notify、notifyAll实现通信
通信是借助Object类的wait、notify、notifyAll来实现的线程执行wait后,就放弃了运行资格,处于冻结状态;当线程运行时,会在内存中建立一个线程池,所有处于冻结状态的线程都存在于线程池中。执行notify时线程池中的线程也会被唤醒。当线程池中有多个线程时,第一个冻结的线程被唤醒。notifyall,唤醒线程池中的所有线程。注意wait、notify、notifyall都是在同步中使用的,因为这三个函数操作的是持有锁的线程,而只有同步才有锁,所以必须在同步中使用;wait、notify、notifyall,用于同步。必须识别其操作的线程所持有的锁,因为等待和唤醒的必须是同一个锁下的线程;和
想了解更多关于多线程和多进程和多线程的区别的详细内容,敬请关注并收藏本站。
发表评论