02 Java 高级03(多线程高级)

02 Java 高级03(多线程高级)

1. 什么是 ThreadLocal?

​ ThreadLocal 叫做本地线程变量,意思是说,ThreadLocal 中填充的的是当前线程的变量,该变量对其他线程而言是封闭且隔离的,ThreadLocal 为变量在每个线程创建了一个副本,这样每个线程都可以访问自己内部的副本变量,避免了线程冲突。

​ 缺陷,就是不会被GC回收(容易出现内存溢出,内存泄漏)

2.线程池的创建方式

4. 为什么要使用线程池?(必问)

降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
提高响应速度,当任务到达时,任务可以不需要等到线程创建就立即执行。
​ 提高线程的可管理性,线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以统一分配。

线程池创建的方式

5、线程池的常用参数(必问)

参数名参数含义
corePoolSize核心线程数
maximumPoolSize最大线程数
keepAliveTime空闲线程存活时间
unit时间单位
workQueue线程池任务队列
threadFactory创建线程的工厂
handler拒绝策略

6、Java内存结构

程序运行有自己的【主内存】、每个【线程有自己的内存空间】、子线程只有给主内存写入内容时才会把子线程的变量和主线程同步

7. 如果保证线程安全?volatile 的作用和特性?(必问)

如何保证线程安全:必须具备三个条件(可见性、有序性、原子性)才能实现线程安全

作用:volatile 是一个轻量级的 synchronized,一般作用于变量,在多处理器开发的过程中保证了内存的可见性。相比于 synchronized 关键字,volatile 关键字的执行成本更低,效率更高。
​ 特性:
可见性:volatile 可以保证不同线程对共享变量进行操作时的可见性。即当一个线程修改了共享变量时,另一个线程可以读取到共享变量被修改后的值。
有序性:volatile 会通过禁止指令重排序进而保证有序性。

​ 创建对象分为3个步骤、1创建对象、2、开辟空间、给空间赋值、3把空间地址指向对象、CPU执行快了后会编程 1 3 2

​ **原子性:**synchronized

9. 什么是乐观锁?什么是悲观锁?(必问)

悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。
乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成功写入。如果数据已经被其他线程更新,则根据不同的实现方式执行不同的操作(例如报错或者自动重试)。
​ 悲观锁适合写操作多的场景,先加锁可以保证写操作时数据正确。
​ 乐观锁适合读操作多的场景,不加锁的特点能够使其读操作的性能大幅提升

10. Java的各种锁(必问)

​ **公平锁:**排队

​ **非公平锁:**先插队,后排队【比如我执行只需要3秒、你执行需要1小时、此时我可以先尝试插队】

可重入锁:又名递归锁,是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提锁对象得是同一个对象或者 class),不会因为之前已经获取过还没释放而阻塞。
​ **非可重入锁:**则与上面相反,再进入该线程的内层方法不会自动获取锁进而造成线程出现死锁,整个等待队列中的所有线程都无法被唤醒。

​ **自旋锁:**自己调用自己一段时间(不阻塞线程)

CAS的ABA问题因为CAS是每次操作数据时、会判断这个数据是否和原始数据相等、但可能这个数据会被别人修改后还原:例如:你是公司的财务、公司账上有500W、每个月15号要发500W的工资、你中途挪用了这500W、在14号这一天把500W放入公司账号

​ 解决方案:加入版本号即可解决、每次版本号自增

锁住的是什么?(必问)

​ 对象【很多个】

​ 类【一个】

11. 为什么 wait,notify 和 notifyAll 这些方法不在 Thread 类里面??

​ 这样是为了简单和方便

​ 原因是 每个线程都拥有锁monitor(锁),所以让当前线程等待某个对象的锁,当然应该通过这个对象来操作,而不是用当前线程来操作,因为当前线程可能会等待多个线程的锁,如果通过线程来操作,就非常复杂了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值