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是一个普通类