线程的生命周期:
线程礼让:
- 礼让线程,让当前正在执行的线程暂停,但不阻塞
- 将线程从运行状态转为就绪状态
- 让cpu重新调度,礼让不一定成功。
线程的同步:
方法一:同步代码块
- 该方法的使用同步的方式解决了线程安全问题。但操作同步代码时,只能有一个线程参与,其他线程等待。相当于一个单线程的过程,效率较低。
- 同步方法中无需指定同步监视器,因为同步监视器是this,就是这个对象本身,或者是class
- 补充:在实现Runnable接口创建多线程的方式中,可以考虑使用this充当同步监视器。
方法二:同步方法
如果操作共享数据的代码完整的声明在一个方法中,并使用synchronized修饰。对于synchronized修饰的实例方法(非static方法)而言,无需显示指定同步监视器,同步方法的同步监视器是this,也就是调用该方法的对象。
- 该类的对象可以被多个线程安全的访问
- 每个线程调用该对象的任意方法后都将得到正确结果
- 每个线程调用该对象的任意方法之后,该对象状态依然保持合理状态
同步监视器的执行过程:
- 第一个线程访问,锁定同步监视器,执行其中代码
- 第二个线程访问,发现同步监视器被锁定,无法访问
- 第一个线程访问完毕,解锁同步监视器
- 第二个线程访问,发现同步监视器没有锁,然后锁定并访问
释放同步监视器的锁定
释放同步监视器锁定的情况
- 当前线程的同步方法、同步代码块执行结束,当前线程即释放同步监视器
- 当前线程在同步代码块、同步方法中遇到break、return终止该代码块、该方法的执行,当前线程将会释放同步监视器
- 当前线程在同步代码块、同步方法中出现了未处理的error和exception,导致该代码块、该方法异常结束时,当前线程会释放同步监视器
- 当前线程执行同步代码块或同步方法时,程序执行了同步监视器的wait()方法,则当前线程暂停,并释放同步监视器
不释放同步监视器
- 线程执行同步代码块或同步方法时,调用Tread.sleep()、Tread.yield()方法来暂停当前线程的执行,当前线程不会释放同步监视器