多线程面试问题总结

start和run之间的区别

https://www.cnblogs.com/agilestyle/p/11421515.html

线程的状态

1、NEW
2、RUNNABLE(RUNNING/ READY)
3、WAITING
4、TIMED_WAITING
5、BLOCKED
6、TERMINATED
图源网络

线程不安全的五个因素:

1、CPU抢占式执行
2、内存可见性(volatile可解决,操作完成时强制删除工作内存)
3、指令重排序(编译器优化)
4、原子性
5、多线程同时修改同一个变量

线程安全问题解决方案

1、锁(让线程排队执行)–synchronized实现原理
2、私有变量

synchronized和lock区别

1、修饰不同,synchronized修饰代码块,静态方法和普通方法;lock只修饰代码块;
2、锁策略不同,synchronized是非公平锁,lock可以启用公平锁,参数true
3、synchronized 自动加锁解锁,lock是手动锁

volatile和synchronized

1、synchronized解决线程不安全的原子性
2、volatile解决内存可见性问题

死锁

定义:由于多线程资源抢占而造成的无限等待问题;
(1)死锁形成要同时满足四个条件:
1、互斥条件(一个资源只能被一个线程持有)
2、请求拥有条件(拥有一个资源后,该线程又请求另外一个资源)
3、不可剥夺条件(资源被线程持有后,不能被剥夺)
4、环路等待条件(多线程在获取资源时形成了一个环形链)
(2)如何解决死锁?
破坏造成死锁的条件,其中互斥条件和不可剥夺条件不可更改,请求拥有条件和环路等待条件可以更改。

线程的通讯机制

wait/notify/notifyall(只能唤醒当前对象的所有等待线程)
wait为什么要加锁?
sleep有明确的时间唤醒,wait默认不传参数,表示永久等待,需要有结束等待的机制,这个机制就是释放锁,所以在释放锁之前需要有一把锁。

Thread.sleep(0) VS Object.wait(0)
1、sleep他是Thread的静态方法;而wait是Object的方法;
2、sleep(0)是立即触发一次CPU的资源抢占,给其他线程多一次机会;
wait(0)是永久的等待下去;
3、俩者都不能接受负数参数,

wait 和 sleep 的区别
1、共同点
①都可以让线程休眠
②都需要处理Interrupt异常
2、不同点
①来自的对象不同,sleep来自Thread,wait来自Object
②参数:wait可以没有参数,sleep必须要有大于等于0的参数
③wait使用时必须要加锁,sleep使用时不用加锁
④wait使用时会释放锁,而sleep不会释放锁(如何证明?)
⑤wait默认不传参name会进入waiting,sleep会进入timed_waiting
为什么将wait放于Object而不是Thread?

wait操作需要有加锁和释放锁的过程,而锁又是属于对象级别而不是线程级别,一个线程可以拥有多把锁,而一个对象只有一把锁,如果wait放入线程中的话需要指定释放哪一把锁?所以灵活起见放入Object。

wait VS LockSupport
1、共同点
①都可以让线程休眠
②都可以传参或不传参,并且二者线程状态也是一致的
2、不同点
①wait必须配合synchronized(加锁),LockSupport不需要加锁
②wait只能唤醒全部或者随机的某一个线程,LockSupport可以唤醒执行的线程
③wait来自Object,LockSupport是一个普通类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值