-
start()
和run()
方法 (start会新启一个线程,run不会)
run()
方法就是普通对象的普通方法start()
方法 java才会将线程对象和操作系统中的实际线程进行映射,再来执行run()
方法
yield()
让出cpu的执行权,将线程从运行状态转到可运行状态,但是下个时间片,该线程依然有可能被再次选中运行守护线程和主线程共死,finally不能保证一定执行
synchronized内置锁
- 对象锁,锁的是类的对象实例
- 类锁,锁的是每个类的Class对象,每个类的Class对象在一个虚拟机中只有一个,所以类锁也只有一个。
private static synchronized void synClass(){ }
volatile
适用于只有一个线程写,多个线程读的场景,因为它只能确保可见性。ThreadLocal
线程变量。可以理解为是个map。类型Map<Thread,Integer>线程间协作。轮训:难以保证及时性,资源开销很大
等待通知
wait()
对象上的方法notify() / notifyAll()
对象上的方法。注意 应该尽量使用notifyAll,使用notify因为有可能发生信号丢失的情况。
join()
线程A,执行了线程B的join方法,线程A必须要等待B完成了以后,线程A才能继续自己的工作。yield()
sleep()
wait()
nodify()
对锁影响
yield():
线程在执行yield()
以后,持有的锁是不会释放的sleep():
sleep()
方法被调用以后,持有的锁是不释放的wait():
调动方法之前,必须要持有锁。调用了wait()
方法以后,锁就会被释放,当wait()
方法返回的时候,线程会重新持有锁notify():
调动方法之前,必须要持有锁,调用notify()
方法本身不会释放锁