Java并发编程
文章平均质量分 64
最常见的 Java 并发编程面试题,带你三分钟搞懂,面试再也不虚。
喵呜刷题
使用 Vx [喵呜刷题],来来来,我们一起组队刷题!
展开
-
线程池中线程回收是如何处理的?
ThreadPoolExecutor 中线程执行getTask()返回null,就会被回收。我们来看看getTask方法是怎么处理的:原创 2022-05-03 10:38:26 · 2138 阅读 · 0 评论 -
说说你了解的守护线程
守护线程是指在程序运行的时候在后台提供一种通用服务的线程,并且这个线程并不属于程序中不可或缺的部分。守护线程不阻止 Java 虚拟机 ( JVM ) 退出的线程。当所有非守护线程终止时,JVM 会放弃所有剩余的守护线程。原创 2022-05-03 10:38:01 · 225 阅读 · 0 评论 -
什么是 Thread 的中断标志?
什么是 Thread 的中断标志?中断 ( interrupt ) 标志或中断状态是线程中断时设置的内部线程标志 ( flag 属性 )。怎么设置中断标志?原创 2022-05-03 10:37:34 · 622 阅读 · 0 评论 -
说说你了解的volatile关键字
volatile是java提供的一种同步手段,只不过它是轻量级的同步,为什么这么说,因为volatile只能保证多线程的内存可见性,不能保证多线程的执行有序性。而要彻底的保证有序性和可见性需要使用synchronized等锁处理。原创 2022-05-03 10:36:44 · 275 阅读 · 0 评论 -
Disruptor为什么会这么快?
没有竞争=没有锁=非常快。所有访问者都记录自己的序号的实现方式,允许多个生产者与多个消费者共享相同的数据结构。原创 2022-05-03 10:36:19 · 120 阅读 · 0 评论 -
说一下 Atomic 的原理?
JDK提供了一些原子操作的类,在java.util.concurrent.atomic下面。如AtomicBoolean,AtomicInteger,AtomicLong都是用原子的方式来更新指定类型的值。原创 2022-05-03 10:35:25 · 383 阅读 · 0 评论 -
Thread 类的 sleep() 方法和对象的 wait() 方法有什么区别?
sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复(线程回到就绪状态)。原创 2022-05-03 10:34:56 · 433 阅读 · 0 评论 -
Runnable 和 Callable 接口有什么区别?
Runnable 接口表示必须在单独的线程中运行的计算单位,它只有一个 run() 方法。Runnable 接口不允许此方法返回值或抛出未经检查的异常。Callable 接口表示具有返回值的任务,它只有一个 call() 方法。call() 方法可以返回一个值 ( 可以是 Void ),也可以抛出一个异常。Callable 通常在 ExecutorService 实例中用于启动异步任务,然后调用返回的 Future 实例以获取其值。原创 2022-05-03 10:34:25 · 685 阅读 · 0 评论 -
Fork Join 框架的用途
Fork Join 框架这个框架被设计用来解决可以使用分而治之技术将任务分解成更小的问题。原创 2022-05-03 10:33:49 · 406 阅读 · 0 评论 -
说说阻塞队列LinkedBlockingQueue与ArrayBlockingQueue的区别
阻塞队列与我们平常接触的普通队列(LinkedList或ArrayList等)的最大不同点,在于阻塞队列支出阻塞添加和阻塞删除方法。原创 2022-05-03 10:33:22 · 974 阅读 · 0 评论 -
说说你对AQS的理解?
AQS就是一个并发包的基础组件,用来实现各种锁,各种同步组件的。它包含了state变量、加锁线程、等待队列等并发中的核心组件。AQS对象内部维护了一个volatile int state(代表共享资源)和一个FIFO线程等待队列(多线程争用资源被阻塞时会进入此队列)。state代表了加锁的状态。加锁 state ++ 释放锁state – 。原创 2022-05-02 10:39:56 · 1283 阅读 · 0 评论 -
说说AQS中的共享锁
Semaphore共享锁信号量(Semaphore),又被称为信号灯,在多线程环境下用于协调各个线程, 以保证它们能够正确、合理的使用公共资源。信号量维护了一个许可集,我们在初始化Semaphore时需要为这个许可集传入一个数量值,该数量值代表同一时间能访问共享资源的线程数量。原创 2022-05-02 10:38:36 · 393 阅读 · 0 评论 -
说说AQS中的独占锁
获取锁的过程:当线程调用acquire()申请获取锁资源,如果成功,则进入临界区。当获取锁失败时,则进入一个FIFO等待队列,然后被挂起等待唤醒。当队列中的等待线程被唤醒以后就重新尝试获取锁资源,如果成功则进入临界区,否则继续挂起等待。原创 2022-05-02 10:38:04 · 196 阅读 · 0 评论 -
Java 如何实现生产者消费者?
Java生产者消费者是最基础的线程同步问题,大概整理了一下有5种生产者消费者的写法,分别如下。用synchronized对存储加锁,然后用object原生的wait() 和 notify()做同步。用concurrent.locks.Lock,然后用condition的await() 和signal()做同步。直接使用concurrent.BlockingQueue。使用PipedInputStream/PipedOutputStream。使用信号量Semaphore。原创 2022-05-02 10:37:22 · 554 阅读 · 1 评论 -
说说信号量Semaphore
Semaphore是一个计数信号量,常用于限制可以访问某些资源(物理或逻辑的)线程数目。原创 2022-05-02 10:36:41 · 535 阅读 · 0 评论 -
说说你对Synchronized的了解
Java 虚拟机中的同步(Synchronization)基于进入和退出管程(Monitor)对象实现, 无论是显式同步(有明确的 monitorenter 和 monitorexit 指令,即同步代码块)还是隐式同步都是如此。原创 2022-05-02 10:35:58 · 360 阅读 · 0 评论 -
多读少写的场景应该使用哪个并发容器,为什么使用它?
CopyOnWriteArrayList是免锁容器。CopyOnWriteArrayList这个容器适用于多读少写。CopyOnWriteArrayList当多个迭代器同时遍历和修改这个列表时,不会抛出ConcurrentModificationException。原创 2022-05-02 10:35:24 · 284 阅读 · 0 评论 -
说说线程的状态流转
1、新建状态(New): 一个尚未调用 Thread.start() 方法启动的新 Thread 实例。2、就绪状态(Runnable): 线程对象创建后,其他线程调用了该对象的Thread.start() 方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权,即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得。原创 2022-05-02 10:34:15 · 395 阅读 · 0 评论 -
如何合理的配置java线程池?
1)配置线程池时CPU密集型任务可以少配置线程数,大概和机器的cpu核数相当,可以使得每个线程都在执行任务2)IO密集型时,大部分线程都阻塞,需要多配置线程数,2cpu核数,非阻塞 IO 按需设置ncpu核数3)有界队列和无界队列的配置需区分业务场景,一般情况下配置有界队列,在一些可能会有爆发性增长的情况下使用无界队列。4)任务非常多时,使用非阻塞队列使用CAS操作替代锁可以获得好的吞吐量。原创 2022-05-02 10:33:44 · 1294 阅读 · 0 评论 -
说说Java线程池
降低资源消耗。重复利用已创建线程,降低线程创建与销毁的资源消耗。(尤其是当程序中需要创建大量生存期很短暂的线程时)提高响应效率。任务到达时,不需等待创建线程就能立即执行。提高线程可管理性。防止服务器过载。内存溢出、CPU耗尽原创 2022-05-02 10:33:12 · 146 阅读 · 0 评论 -
Java中控制线程的方法
Java线程提供了很多工具方法,这些方法都很好的控制线程原创 2022-05-06 10:26:12 · 1268 阅读 · 0 评论 -
说说线程的生命周期
线程的生命周期分为创建(new)、就绪(Runnable)、运行(running)、阻塞(Blocked)、死亡(Dead)五种状态。原创 2022-05-01 10:18:55 · 3077 阅读 · 1 评论 -
说说Callable和Future
Callable接口定义了一个call方法可以作为线程的执行体,call方法比run方法更强大:A、call方法可以有返回值B、call方法可以申明抛出异常原创 2022-05-01 10:18:20 · 339 阅读 · 1 评论 -
说说ThreadLocal类
ThreadLocal,是Thread Local Variable(线程的局部变量)的意思。线程局部变量功能非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立的改变自己的副本,而不会和其他线程的副本冲突。原创 2022-05-01 10:17:49 · 261 阅读 · 1 评论 -
说说sleep和 wait有什么区别
1)sleep是线程类(Thread)的方法;wait是Object类的方法原创 2022-05-01 10:17:19 · 18738 阅读 · 4 评论 -
说说什么是资源限制
资源限制是指在进行并发编程时,程序的执行速度受限于计算机硬件资源或软件资源。原创 2022-05-01 10:14:42 · 1235 阅读 · 0 评论 -
说说并发编程的常见问题
并发编程并不是银弹,做为一种基于共享内存的并发编程,它会存在很多编程上的问题,比如:上下文切换、死锁、线程饥饿、竞争条件、Bug难以重现和定位并发编程的目的是为了让程序运行得更快。但是,并不是启动更多的线程就能让程序最大限度地并发执行。原创 2022-05-01 10:13:52 · 245 阅读 · 0 评论 -
说说并发和并行有什么区别?
并行指在同一时刻,有多条指令(线程)在多个处理器上同时执行;并发指在同一时刻只能有一个指令(线程)执行,但多个进程指令被快速轮换执行,使得宏观上具有多个进程同时执行的效果。原创 2022-05-01 10:11:16 · 386 阅读 · 0 评论 -
说说进程和线程的区别?
进程是处于运行中的程序,具有一定的独立能力,进程是系统进行资源分配和调度的一个独立单位。原创 2022-05-01 10:09:52 · 158 阅读 · 0 评论 -
读写锁可以用于什么应用场景?
读写锁可以用于 “多读少写” 的场景,读写锁支持多个读操作并发执行,写操作只能由一个线程来操作。原创 2022-05-01 10:09:00 · 2241 阅读 · 0 评论 -
说说 Java中有那些锁
公平锁:是指按照申请锁的顺序来获取锁。非公锁:线程获取锁的顺序不一定按照申请锁的顺序来的。ReentrantLock 默认是不公平锁,传入true为公平锁,否则为非公平锁原创 2022-05-01 10:08:34 · 480 阅读 · 0 评论 -
Lock与synchronized的区别?
Lock 是一个接口;synchronized 是 Java 中的关键字,synchronized 是内置的语言实现;原创 2022-04-30 11:54:56 · 362 阅读 · 0 评论 -
Synchronized 各种加锁场景的作用范围?
1.作用于非静态方法,锁住的是对象实例(this),每一个对象实例有一个锁。public synchronized void method() {}原创 2022-04-30 11:54:16 · 653 阅读 · 0 评论 -
java中有几种方法可以实现一个线程?
Java中实现线程的两种方法第一是实现Runnable接口实现它的run()方法。第二种是继承Thread类,覆盖它的run()方法。原创 2022-04-30 11:52:27 · 2153 阅读 · 0 评论