JUC面试速记【锁嗨面试官】

1.进程:进程是资源分配和管理的最小单位
**2.线程:**线程是操作系统(CPU)调度和执行的最小单位。CPU会在这些线程上来回切换,让使用者感觉线程是在同时执行的。每个线程都会拥有自己的程序计数器,堆栈,局部变量等属性,并且能够访问共享变量
**3.线程的上下文切换:**线程从挂起再加载的过程,就是一次上下切换。CPU通过时间片分配给每个线程的执行时间,当某个线程获取到CPU时间片后,就会在规定的时间内执行。当时间片到期时,则该线程会进入挂起等待状态。
4.线程终止:线程在正常当下run执行完,或出现异常都会让该线程终止。
suspend();暂停 【过时】
resume();恢复【过时】
stop();终止【过时】
interrupted优雅的中断标识
5.run()和start方法区别:
当线程执行了start()方法后,才真正意义上的启动线程。会让一个线程进入就绪状态分配CPU时间片,分到时间片后才会调用run()。start方法不可以在同一个线程中重复调用,否则会出现异常,因为重复调用start方法,线程的state状态就不是new了,那么threadStatus就不对于0了;
run()方法仅仅是一个普通方法,与类中的方法意义相同.在该方法中可以实现线程执行的业务逻辑。并不会开启一个新的线程。可以重复执行;
6.等待通知范式
笔试:对于等待通知来说,需要有生产者(通知方)与消费者(等待方)

7.wait和sleep的区别
sleep()方法是Thread类中的;wait()方法,则是属于Object类中的在这里插入图片描述

sleep()方法是让出CPU调度,到指定时间后会运行状态;wait()方法是将状态改为等待状态,需要调用notify()方法才能进入运行状态;
sleep()方法中线程不会释放锁。wait()方法会释放锁;
8.线程的优先级
线程的优先级的范围:1~10 默认:5.通过setPriority()修改优先级
9.守护线程
是一种支持型的线程。当线程实例没有被设置为守护线程时,该线程并不会随着主线程的结束而结束。但是当被设置为守护线程后,当主线程结束,该线程也会伴随着结束。同时守护线程不一定会执行finally代码块。所以当线程被设定为守护线程后,无法确保清理资源等操作一定会被执行。
10.
在这里插入图片描述

11.synchronized实现原理
12.synchronized锁优化
锁的级别:无锁、偏向锁、轻量级锁、重量级锁。

在这里插入图片描述

13.自旋锁
线程的阻塞和唤醒需要CPU从用户态转为内核态。
自旋:就是让线程在一个没有意义的for循环中继续运行。目的就是为了减少等待和唤醒。
线程在运行就是会消耗CPU所以如果消耗过大的话,自旋则是得不偿失。应该还是要挂起
自适应自旋锁:自旋的次数不再固定。增加了一个判断就是曾经自旋成功的线程会加次数,自旋失败的会减少。就像尝到甜头会继续,尝到苦的不再试。
锁消除:去锁。去掉不可能会存在资源竞争的锁。是在编译时进行锁的消除.jdk1.8自动开启
偏向锁:锁偏向执行过的线程【MarkWord升级关键字/标识】
轻量级锁:在同一代码块,有第二条线程过来竞争时。偏向锁会升级为轻量级锁
重量级锁:通过对象内部的监视器(monitor)实现,操作系统实现线程之间的切换需要从用户态到内核态的切换,切换成本非常高。竞争失败后,线程阻塞,释放锁后,唤醒阻塞的线程,不使用自旋锁,不会那么消耗CPU,所以重量级锁适合用在同步块执行时间长的情况下。
在这里插入图片描述
锁的升级!!
在这里插入图片描述

**死锁:**在多线程环境中,多个线程可以竞争有限数量的资源。当一个线程申请资源时,如果这时没有可用资源,那么这个线程进入等待状态。如果所申请的资源被其他等待线程占有,那么该等待线程有可能再也无法改变状态。这种情况称为死锁【交叉闭环】
避免死锁:
1)避免一个线程同时获取多个锁。
2)避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。
3)尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值