网页设计怎么建立网站,学网站建设学校,公司网站开发设计题目怎么写,韩国美容网站模板目录
16、CAS 的问题
17、什么是 Future#xff1f;
18、什么是 AQS
19、AQS 支持两种同步方式#xff1a;
20、ReadWriteLock 是什么
21、FutureTask 是什么
22、synchronized 和 ReentrantLock 的区别
23、什么是乐观锁和悲观锁
24、线程 B 怎么知道线程 A 修改了…目录
16、CAS 的问题
17、什么是 Future
18、什么是 AQS
19、AQS 支持两种同步方式
20、ReadWriteLock 是什么
21、FutureTask 是什么
22、synchronized 和 ReentrantLock 的区别
23、什么是乐观锁和悲观锁
24、线程 B 怎么知道线程 A 修改了变量
25、synchronized、volatile、CAS 比较
26、sleep 方法和 wait 方法有什么区别?
27、ThreadLocal 是什么有什么用
28、为什么 wait()方法和 notify()/notifyAll()方法要在同步块中被调用
29、多线程同步有哪几种方法
30、线程的调度策略
31、ConcurrentHashMap 的并发度是什么
32、Linux 环境下如何查找哪个线程使用 CPU 最长 16、CAS 的问题
1、CAS 容易造成 ABA 问题
一个线程 a 将数值改成了 b接着又改成了 a此时 CAS 认为是没有变化其实是已经变化过了而这个问题的解决方案可以使用版本号标识每操作一次version 加 1。在 java5 中已经提供了 AtomicStampedReference 来解决问题。
2、不能保证代码块的原子性
CAS 机制所保证的知识一个变量的原子性操作而不能保证整个代码块的原子性。比如需要保证 3 个变量共同进行原子性的更新就不得不使用 synchronized 了。
3、CAS 造成 CPU 利用率增加
之前说过了 CAS 里面是一个循环判断的过程如果线程一直没有获取到状态cpu资源会一直被占用。 17、什么是 Future
在并发编程中我们经常用到非阻塞的模型在之前的多线程的三种实现中不管是继承 thread 类还是实现 runnable 接口都无法保证获取到之前的执行结果。通过实现 Callback 接口并用 Future 可以来接收多线程的执行结果。Future 表示一个可能还没有完成的异步任务的结果针对这个结果可以添加Callback 以便在任务执行成功或失败后作出相应的操作。 18、什么是 AQS
AQS 是 AbustactQueuedSynchronizer 的简称它是一个 Java 提高的底层同步工具类用一个 int 类型的变量表示同步状态并提供了一系列的 CAS 操作来管理这个同步状态。
AQS 是一个用来构建锁和同步器的框架使用 AQS 能简单且高效地构造出应用广泛的大量的同步器比如我们提到的 ReentrantLockSemaphore其他的诸如ReentrantReadWriteLockSynchronousQueueFutureTask 等等皆是基于AQS 的。 19、AQS 支持两种同步方式
1、独占式
2、共享式
这样方便使用者实现不同类型的同步组件独占式如 ReentrantLock共享式如SemaphoreCountDownLatch组合式的如 ReentrantReadWriteLock。总之AQS 为使用提供了底层支撑如何组装实现使用者可以自由发挥。 20、ReadWriteLock 是什么
首先明确一下不是说 ReentrantLock 不好只是 ReentrantLock 某些时候有局限。如果使用 ReentrantLock可能本身是为了防止线程 A 在写数据、线程 B 在读数据造成的数据不一致但这样如果线程 C 在读数据、线程 D 也在读数据读数据是不会改变数据的没有必要加锁但是还是加锁了降低了程序的性能。因为这个才诞生了读写锁 ReadWriteLock。ReadWriteLock 是一个读写锁接口ReentrantReadWriteLock 是 ReadWriteLock 接口的一个具体实现实现了读写的分离读锁是共享的写锁是独占的读和读之间不会互斥读和写、写和读、写和写之间才会互斥提升了读写的性能。 21、FutureTask 是什么
这个其实前面有提到过FutureTask 表示一个异步运算的任务。FutureTask 里面可以传入一个 Callable 的具体实现类可以对这个异步运算的任务的结果进行等待获取、判断是否已经完成、取消任务等操作。当然由于 FutureTask 也是Runnable 接口的实现类所以 FutureTask 也可以放入线程池中。 22、synchronized 和 ReentrantLock 的区别
synchronized 是和 if、else、for、while 一样的关键字ReentrantLock 是类这是二者的本质区别。既然 ReentrantLock 是类那么它就提供了比synchronized 更多更灵活的特性可以被继承、可以有方法、可以有各种各样的类变量ReentrantLock 比 synchronized 的扩展性体现在几点上
1、ReentrantLock 可以对获取锁的等待时间进行设置这样就避免了死锁
2、ReentrantLock 可以获取各种锁的信息
3、ReentrantLock 可以灵活地实现多路通知
另外二者的锁机制其实也是不一样的。ReentrantLock 底层调用的是 Unsafe 的park 方法加锁synchronized 操作的应该是对象头中 mark word这点我不能确定。 23、什么是乐观锁和悲观锁
1、乐观锁就像它的名字一样对于并发间操作产生的线程安全问题持乐观状态乐观锁认为竞争不总是会发生因此它不需要持有锁将比较-替换这两个动作作为一个原子操作尝试去修改内存中的变量如果失败则表示发生冲突那么就应该有相应的重试逻辑。
2、悲观锁还是像它的名字一样对于并发间操作产生的线程安全问题持悲观状态悲观锁认为竞争总是会发生因此每次对某资源进行操作时都会持有一个独占的锁就像 synchronized不管三七二十一直接上了锁就操作资源了。 24、线程 B 怎么知道线程 A 修改了变量
1、volatile 修饰变量
2、synchronized 修饰修改变量的方法
3、wait/notify
4、while 轮询 25、synchronized、volatile、CAS 比较
1、synchronized 是悲观锁属于抢占式会引起其他线程阻塞。
2、volatile 提供多线程共享变量可见性和禁止指令重排序优化。
3、CAS 是基于冲突检测的乐观锁非阻塞 26、sleep 方法和 wait 方法有什么区别?
这个问题常问sleep 方法和 wait 方法都可以用来放弃 CPU 一定的时间不同点在于如果线程持有某个对象的监视器sleep 方法不会放弃这个对象的监视器wait 方法会放弃这个对象的监视器 27、ThreadLocal 是什么有什么用
ThreadLocal 是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射各个线程之间的变量互不干扰在高并发场景下可以实现无状态的调用特别适用于各个线程依赖不通的变量值完成操作的场景。简单说 ThreadLocal 就是一种以空间换时间的做法在每个 Thread 里面维护了一个以开地址法实现的 ThreadLocal.ThreadLocalMap把数据进行隔离数据不共享自然就没有线程安全方面的问题了。 28、为什么 wait()方法和 notify()/notifyAll()方法要在同步块中被调用
这是 JDK 强制的wait()方法和 notify()/notifyAll()方法在调用前都必须先获得对象的锁 29、多线程同步有哪几种方法
Synchronized 关键字Lock 锁实现分布式锁等。 30、线程的调度策略
线程调度器选择优先级最高的线程运行但是如果发生以下情况就会终止线程的运行
1、线程体中调用了 yield 方法让出了对 cpu 的占用权利
2、线程体中调用了 sleep 方法使线程进入睡眠状态
3、线程由于 IO 操作受到阻塞
4、另外一个更高优先级线程出现
5、在支持时间片的系统中该线程的时间片用完 31、ConcurrentHashMap 的并发度是什么
ConcurrentHashMap 的并发度就是 segment 的大小默认为 16这意味着最多同时可以有 16 条线程操作 ConcurrentHashMap这也是ConcurrentHashMap 对 Hashtable 的最大优势任何情况下Hashtable 能同时有两条线程获取 Hashtable 中的数据吗 32、Linux 环境下如何查找哪个线程使用 CPU 最长
1、获取项目的 pidjps 或者 ps -ef | grep java这个前面有讲过
2、top -H -p pid顺序不能改变 要想了解更多
千题千解·Java面试宝典_时光の尘的博客-CSDN博客