![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
06 并发多线程
Lamiaomiao
好好学习,天天向上
展开
-
15 其他问题
4. 如何控制多线程的执行顺序?join方法CountDownLatchCyclicBarrier利用并发包里的Executors的newSingleThreadExecutor产生一个单线程的线程池5. 三个线程如何实现交替打印ABC6. 操作系统进程间通信方式?管道、FIFO、消息队列、信号量、共享内存区7. 线程间通信方式?在java中,多个线程是通过写-读内存中的公共资源进行通信的。8. 线程交互方式?wait()、notify()9. 怎么控制线程尽可能减少上下文切换?原创 2020-08-09 00:15:25 · 78 阅读 · 0 评论 -
14 如何多个线程按顺序执行
如何控制多线程的执行顺序?方法一:使用join()方法让一个线程强制运行调用一个线程的join()方法就可以让这个线程强制运行,并且它会阻塞主线程的运行。原理:调用join方法,会调用join(0)方法,当参数为0时,会调用wait方法,使主线程阻塞,等待子线程执行完毕后,主线程结束等待,继续执行。wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。public static void main(String[] args) {try {原创 2020-08-12 21:48:06 · 5205 阅读 · 0 评论 -
13 线程常用方法
1. wait和notify涉及3个方法:wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器notify():一旦执行此方法,就会唤醒被wait的一个线程。如果有多个线程被wait,就唤醒优先级高的线程notifyAll():一旦执行此方法,就会唤醒所有被wait的线程说明:1.wait(),notify(),notifyAll()三个方法必须使用在同步代码块或同步方法中2.wait(),notify(),notifyAll()三个方法的调用者必须是同步代码块或同步原创 2020-08-09 00:14:55 · 126 阅读 · 0 评论 -
12 sleep wait区别 notify
1. wait和sleep区别相同点:一旦执行方法,都可以使得当前线程进入阻塞状态sleep()方法是线程类(Thread)的静态方法,wait()方法是Object类里的方法。sleep是线程类的方法,wait是Object类的方法。sleep()可以在任何需要的场景下调用。wait必须使用在同步代码块中如果两个方法都在同步代码块或同步方法中,sleep不会释放锁,wait会释放锁sleep()必须捕获异常,wait()方法、notify()方法和notiftAll()方法不需要捕获异常原创 2020-08-09 00:14:20 · 199 阅读 · 0 评论 -
11 线程生命周期状态
1.线程的生命周期(5种状态)在线程的生命周期中,它会经过新建(New)、就绪(Running)、阻塞(Blocked)和死亡(Dead)五种状态。由于CPU在多条线程之间切换,于是线程状态会多次在就绪和运行之间切换新建状态:当程序使用 new 关键字创建一个线程后,该线程就处于新建状态,此时它仅仅由Java虚拟机分配内存,并初始化其成员变量的值。程序只能对新建状态的线程调用一次 start() 方法。就绪状态:当线程对象调用 start() 方法后,该线程并没有马上执行而是进入就绪状态,Java虚原创 2020-08-09 00:13:49 · 122 阅读 · 0 评论 -
10 线程实现方式 execute submit
1. Java中多线程有哪几种实现方式?继承 Thread 类并重写run方法实现Runnable接,重写run方法实现 Callable 接口,通过FutureTask包装器来创建Thread线程通过线程池创建线程1.1继承 Thread 类并重写run方法java.lang.Thread 类的实例就是一个线程但是它需要调用java.lang.Runnable接口来执行,由于线程类本身就是调用的Runnable接口所以你可以继承 java.lang.Thread 类或者直接调用Runnab原创 2020-08-08 21:11:26 · 207 阅读 · 0 评论 -
09 进程 线程区别
1. 线程和进程的定义进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。线程是进程的一个执行路径,一个进程中至少有一个线程。线程是CPU资源分配的基本单位。进程中的多个线程共享进程的堆和方法区资源,但是每个线程有自己的程序计数器和栈区域。2. 线程和进程的区别?进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位进程之间的切换会有较大的开销,线程可以看做轻量级的进程,线程的切换和调度远远小于进程。系统在运行的时候会为每个进程分配不同的内存空间,而同一个原创 2020-08-08 21:10:53 · 74 阅读 · 0 评论 -
08 同步异步 阻塞非阻塞 并行并发
1.同步和异步的区别?同步方法调用后,调用者必须等到方法调用返回后,才能继续后续行为。异步方法调用发出后,调用者不需要等待返回结果,只需要向系统委托一个异步过程,那么当系统接收到返回值或消息时,系统会自动触发委托的异步过程。2.并行和并发的区别?并行:多个CPU同时执行多个任务。比如:多个人同时做不同的事并发:一个CPU(采用时间片)同时执行多个任务。比如:多个人同时做一件事并行是指当系统有一个以上CPU时,当一个CPU执行一个进程时,另一个CPU可以执行另一个进程,两个进程互不抢占CPU原创 2020-08-08 21:10:21 · 78 阅读 · 0 评论 -
07 死锁
1. 什么是死锁?什么情况会发生死锁?线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行,就会产生死锁。饥饿是指线程因为种种原因无法获取所需要的资源,导致线程一直无法执行。2. 死锁产生原因系统资源的竞争导致系统资源不足,以及资源分配不当,导致死锁。进程在运行过程中,请求和释放资源的顺序不当,会导致死锁。3. 死锁的前提(4个必要条件)互斥条件:一个资源每次只能被一个进程使用,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程原创 2020-08-08 21:09:45 · 96 阅读 · 0 评论 -
06 ThreadLocal countdownLatch cyclicBarrier
1. 线程的局部变量是什么?线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java 提供 ThreadLocal 类来支持线程局部变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。2. ThreadLocal是什么?ThreadLocal原理?ThreadLocal是解决多线程的并发问题的一种方式,当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程原创 2020-08-08 21:09:15 · 75 阅读 · 0 评论 -
05 CAS
1. 什么是悲观锁、乐观锁?乐观锁执行操作前认为不会导致冲突,操作数据时,不进行任何特殊处理,在进行更新后,才会去判断是否有冲突。悲观锁操作数据时,认为操作会出现数据冲突,所以在进行每次操作时都要通过获取锁才能进行对相同数据的操作。2. 悲观锁和乐观锁(CAS)应用场景?乐观锁适用于资源竞争较少的情况下,也就是冲突很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,用悲观锁比较合适。3. CAS是什么(原理)?是线程安全的不?有什么问题?CAS是compar原创 2020-08-08 21:08:38 · 203 阅读 · 0 评论 -
04 线程池
1. 为什么要用线程池创建线程和回收线程都会占用系统资源,如果任务来了才创建线程那么响应时间会变长。因此,需要提前创建一些线程,这些线程交给线程池管理。这样可以降低资源消耗,提高响应速度,提高线程的可管理性。2. 线程池参数的意义corePoolSize:表示核心线程池的大小。当提交一个任务时,如果当前线程池的线程个数没有达到corePoolSize,则会创建新的线程来执行所提交的任务,即使当前核心线程池有空闲的线程。如果当前核心线程池的线程个数已经达到了corePoolSize,则不再重新创建线程原创 2020-08-08 21:08:04 · 87 阅读 · 1 评论 -
03 ReentrantLock
1. 什么是重入锁?有哪些可重入锁?重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层可以再次获取同一个锁,并且不发生死锁,这样的锁就叫做可重入锁。synchronized、ReentrantLock、ReentrantReadWriteLock2. ReentrantLock(Lock)实现原理?(写的不好)ReentrantLock(Lock)主要依靠volatile的state变量和CAS乐观锁来保证线程安全,使用AQS来管理等待的线程。3. AQS是什么?底层实现? 同步队列,原创 2020-08-08 21:07:21 · 63 阅读 · 0 评论 -
02 volatile
关键字volatile1.多线程的三个特性?原子性:是指一个操作是不可中断的。即使是多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。可见性:是指当一个线程修改了某一个共享变量的值,其他线程能够立即知道这个修改。有序性:在并发时,程序的执行可能会出现乱序。有序性问题的原因是因为程序在执行时,可能会进行指令重排,重排后的指令与原指令的顺序未必一致。2.产生线程可见性的原因?保证线程可见性有哪些方法每个线程都在自己的缓存中保存着共享变量的副本,一个线程对共享变量进行更改,其他线程原创 2020-08-08 21:06:50 · 85 阅读 · 0 评论 -
01 synchronized
对锁的理解由于在多线程环境下对共享变量进行修改会产生数据不一致的问题,所以就需要需要用到锁来保证线程安全(做同步)(同步:一个线程在对共享变量进行操作时,其他线程都不可以对这个共享变量进行操作,直到该线程完成操作)。而同步的本质是通过锁来实现的。锁是一种抽象的概念,实际上它是一个标记。为了实现每次只能有一个线程进入代码块,那么需要在某个地方做个标记,这个标记必须每个线程都能看到,当标记不存在时可以设置该标记,其余后续线程发现已经有标记了则等待拥有标记的线程结束同步代码块取消标记后再去尝试设置标记。这个原创 2020-08-08 21:05:46 · 101 阅读 · 0 评论