page contents
Nen
Nen - 程序员

性别: 天津 - 天津市 注册于 2021-06-23

向TA求助
2850金币数
43180 经验值
1个粉丝
主页被访问 6250 次

3096 个回答

0 赞同

说下对同步器 AQS 的理解?

AQS 的全称为:AbstractQueuedSynchronizer,这个类在 java.util.concurrent.locks 包下面。AQS 是一个用来构建锁和同步器的框架,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器,比如:我们提到的 ReentrantLock,Semaphore,其他的诸如ReentrantReadWriteLock,SynchronousQueue,FutureTask 等等皆是基于 AQS 的...

回答于 2022-01-25 11:01

0 赞同

AQS 的原理是什么?

AQS 核心思想是:如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制 AQS 是用 CLH 队列锁实现的,即将暂时获取不到锁的线程加入到队列中。 CLH队列:CLH(Craig, Landin,...

回答于 2022-01-25 11:01

0 赞同

AQS 对资源的共享模式有哪些?

Exclusive(独占):只有一个线程能执行,如:ReentrantLock,又可分为公平锁和非公平锁: Share(共享):多个线程可同时执行,如:CountDownLatch、Semaphore、CountDownLatch、 CyclicBarrier、ReadWriteLock。

回答于 2022-01-25 11:01

0 赞同

AQS 底层使用了模板方法模式,你能说出几个需要重写的方法吗?

使用者继承 AbstractQueuedSynchronizer 并重写指定的方法。将 AQS 组合在自定义同步组件的实现中,并调用其模板方法,而这些模板方法会调用使用者重写的方法。 isHeldExclusively() :该线程是否正在独占资源。只有用到 condition 才需要去实现它。 tryAcquire(int) :独占方式。尝试获取资源,成功则返回 true,失败则...

回答于 2022-01-25 11:00

0 赞同

说下对信号量 Semaphore 的理解?

synchronized 和 ReentrantLock 都是一次只允许一个线程访问某个资源,Semaphore (信号量)可以指定多个线程同时访问某个资源。 执行 acquire 方法阻塞,直到有一个许可证可以获得然后拿走一个许可证;每个 release 方法增加一个许可证,这可能会释放一个阻塞的 acquire 方法。然而,其实并没有实际的许可证这个对象,Semap...

回答于 2022-01-25 11:00

0 赞同

CountDownLatch 和 CyclicBarrier 有什么区别?

CountDownLatch 是计数器,只能使用一次,而 CyclicBarrier 的计数器提供 reset 功能,可以多次使用。 对于 CountDownLatch 来说,重点是“一个线程(多个线程)等待”,而其他的 N 个线程在完成“某件事情”之后,可以终止,也可以等待。而对于 CyclicBarrier,重点是多个线程,在任意一个线程没有完成,所有的线程都必须等待...

回答于 2022-01-25 10:59

0 赞同

说下对线程池的理解?为什么要使用线程池?

线程池提供了一种限制和管理资源(包括执行一个任务)的方式。每个线程池还维护一些基本统计信息,例如:已完成任务的数量。 使用线程池的好处 1、降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗; 2、 提高响应速度:当任务到达时,任务可以不需要的等到线程创建就能立即执行; 3、 提高线程的可...

回答于 2022-01-25 10:59

0 赞同

创建线程池的参数有哪些?

1、 corePoolSize(线程池的基本大小):当提交一个任务到线程池时,如果当前 poolSize < corePoolSize 时,线程池会创建一个线程来执行任务,即使其他空闲的基本线程能够执行新任务也会创建线程,等到需要执行的任务数大于线程池基本大小时就不再创建。如果调用了线程池的prestartAllCoreThreads() 方法,线程池会提前...

回答于 2022-01-25 10:58

0 赞同

如何在项目中使用 synchronized 的?

synchronized 关键字最主要的三种使用方式: 1、 修饰实例方法:作用于当前对象实例加锁,进入同步代码前要获得当前对象实例的锁; 2、修饰静态方法:作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁 。也就是给当前类加锁,会作用于类的所有对象实例,因为静 态成员不属于任何一个实例对象,是类成员(stati...

回答于 2022-01-24 13:56

0 赞同

说说 JDK1.6 之后的 synchronized 关键字底层做了哪些优化,可以...

说明:这道题答案有点长,但是回答的详细面试会很加分。 JDK1.6 对锁的实现引入了大量的优化,如偏向锁、轻量级锁、自旋锁、适应性自旋锁、锁消除、锁粗化等技术来减少锁操作的开销。 锁主要存在四种状态,依次是:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态,它们会随着竞争的激烈而逐渐升级。注意锁可以升级不...

回答于 2022-01-24 13:55