Skip to content

1、阻塞队列和非阻塞队列区别

1、 当队列阻塞队列为空的时,从队列中获取元素的操作将会被阻塞。

2、 或者当阻塞队列是满时,往队列里添加元素的操作会被阻塞。

3、 或者试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。

4、 试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来

2、类加载有几个过程?

加载、验证、准备、解析、初始化。

3、线程 B 怎么知道线程 A 修改了变量

1、 volatile 修饰变量

2、 synchronized 修饰修改变量的方法

3、 wait/notify

4、 while 轮询

4、如何停止一个正在运行的线程?

在java中有以下3种方法可以终止正在运行的线程:

1、 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。

2、 使用stop方法强行终止,但是不推荐这个方法,因为stop和suspend及resume一样都是过期作废的方法。

3、 使用interrupt方法中断线程。

5、什么是线程死锁

1、 死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(线程)称为死锁进程(线程)。

2、 多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。

3、 如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方的资源,所以这两个线程就会互相等待而进入死锁状态。

![87_1.png][87_1.png]

6、常用的并发工具类有哪些?

CountDownLatch

CountDownLatch 类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他3个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。

CyclicBarrier (回环栅栏) CyclicBarrier它的作用就是会让所有线程都等待完成后才会继续下一步行动。

CyclicBarrier初始化时规定一个数目,然后计算调用了CyclicBarrier.await()进入等待的线程数。当线程数达到了这个数目时,所有进入等待状态的线程被唤醒并继续。

CyclicBarrier初始时还可带一个Runnable的参数, 此Runnable任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行。

Semaphore (信号量) Semaphore 是 synchronized 的加强版,作用是控制线程的并发数量(允许自定义多少线程同时访问)。就这一点而言,单纯的synchronized 关键字是实现不了的。

Semaphore是一种基于计数的信号量。它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞。Semaphore可以用来构建一些对象池,资源池之类的,比如数据库连接池,我们也可以创建计数为1的Semaphore,将其作为一种类似互斥锁的机制,这也叫二元信号量,表示两种互斥状态。它的用法如下:

7、并发编程三个必要因素是什么?

原子性:

原子,即一个不可再被分割的颗粒。原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。

可见性:

一个线程对共享变量的修改,另一个线程能够立刻看到。(synchronized,volatile)

有序性:

程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行重排序)

8、safepoint 是什么?

1、 为了减少对象引用的扫描,使用 OopMap 的数据结构在特定的位置记录下栈里和寄存器里哪些位置是引用;

2、 但为了避免给每条指令都生成 OopMap 记录占用大量内存的问题,只在特定位置记录这些信息。

3、 安全点的选定既不能太少以至于让收集器等待时间过长,也不能太过频繁以至于过分增大运行时的内存负荷。安全点位置的选取基本上是以“是否具有让程序长时间执行的特征”为标准进行选定的,如方法调用、循环跳转、异常跳转等都属于指令序列复用。

9、如何让正在运行的线程暂停一段时间?

我们可以使用Thread类的Sleep()方法让线程暂停一段时间。需要注意的是,这并不会让线程终止,一旦从休眠中唤醒线程,线程的状态将会被改变为Runnable,并且根据线程调度,它将得到执行。

10、synchronized可重入的原理

重入锁是指一个线程获取到该锁之后,该线程可以继续获得该锁。底层原理维护一个计数器,当线程获取该锁时,计数器加一,再次获得该锁时继续加一,释放锁时,计数器减一,当计数器值为0时,表明该锁未被任何线程所持有,其它线程可以竞争获取锁。

11、JVM调优命令有哪些?

12、什么是Executors框架?

13、单例模式了解吗?给我解释一下双重检验锁方式实现单例模式!”

14、Parallel Old 收集器(多线程标记整理算法)

15、什么情况会造成元空间溢出?

16、Java对象的布局了解过吗?

17、volatile关键字的作用

18、程序计数器为什么是私有的?

19、如何判断对象是否是垃圾?

20、为什么使用Executor框架?

21、模块化编程与热插拔

22、JVM 年轻代到年老代的晋升过程的判断条件是什么呢?

23、说说你知道的几种主要的JVM参数

24、JVM内存模型

25、CopyOnWriteArrayList 的缺点?

26、双亲委派模型是什么?

27、volatile有什么用?能否用一句话说明下volatile的应用场景?

28、FutureTask是什么

29、线程类的构造方法、静态块是被哪个线程调用的

30、如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?

31、方法区/永久代(线程共享)

32、栈帧里面包含哪些东西?

用心去做高质量的内容网站,欢迎 star ⭐ 让更多人发现