线程同步

线程的生命周期:

线程礼让:

  1. 礼让线程,让当前正在执行的线程暂停,但不阻塞
  2. 将线程从运行状态转为就绪状态
  3. 让cpu重新调度,礼让不一定成功。

线程的同步:

方法一:同步代码块

  • 该方法的使用同步的方式解决了线程安全问题。但操作同步代码时,只能有一个线程参与,其他线程等待。相当于一个单线程的过程,效率较低。
  • 同步方法中无需指定同步监视器,因为同步监视器是this,就是这个对象本身,或者是class
  • 补充:在实现Runnable接口创建多线程的方式中,可以考虑使用this充当同步监视器。

方法二:同步方法

如果操作共享数据的代码完整的声明在一个方法中,并使用synchronized修饰。对于synchronized修饰的实例方法(非static方法)而言,无需显示指定同步监视器,同步方法的同步监视器是this,也就是调用该方法的对象。

  • 该类的对象可以被多个线程安全的访问
  • 每个线程调用该对象的任意方法后都将得到正确结果
  • 每个线程调用该对象的任意方法之后,该对象状态依然保持合理状态

同步监视器的执行过程:

  1. 第一个线程访问,锁定同步监视器,执行其中代码
  2. 第二个线程访问,发现同步监视器被锁定,无法访问
  3. 第一个线程访问完毕,解锁同步监视器
  4. 第二个线程访问,发现同步监视器没有锁,然后锁定并访问

释放同步监视器的锁定

 

释放同步监视器锁定的情况

  • 当前线程的同步方法、同步代码块执行结束,当前线程即释放同步监视器
  • 当前线程在同步代码块、同步方法中遇到break、return终止该代码块、该方法的执行,当前线程将会释放同步监视器
  • 当前线程在同步代码块、同步方法中出现了未处理的error和exception,导致该代码块、该方法异常结束时,当前线程会释放同步监视器
  • 当前线程执行同步代码块或同步方法时,程序执行了同步监视器的wait()方法,则当前线程暂停,并释放同步监视器

不释放同步监视器

  • 线程执行同步代码块或同步方法时,调用Tread.sleep()、Tread.yield()方法来暂停当前线程的执行,当前线程不会释放同步监视器

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值