java的线程同步

问题:前面学习的线程都是独立的,而且异步执行,也就是说每个线程都包含了运行时所需要的数据或方法,不需要外部资源或方法,也不必关心其他线程的状态或行为。但是经常有一些同时运行的线程需要共享数据,此时就需要考虑其他线程的状态或行为,否则就不能保证程序运行结果的正确性。
解决方案:
线程同步:当两个或多个线程需要访问<同一资源>时,需要已某种顺序确保该资源某一时刻只能被一个线程使用的方式。
采用同步来控制线程的执行有两种方式:同步方法和同步代码块。这两种方法都使用synchronized关键字实现。
①同步方法:通过在方法声明中加入synchronized关键字来声明同步方法。使用synchronized修饰的方法控制对类成员变量的访问。每个类实力对应一把锁,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对应每一个实例,其所有shengmingweisynchronized的方法只能有一个处于可执行状态,从而有效避免了类成员变量的访问冲突。
同步方法的缺陷:
如果将一个运行时间比较长的方法声明成synchronized将会影响效率。
②同步代码块:
语法:
synchronized (syncObject){
//需要同步访问控制的代码
}
synchronized块中的代码必须获得对象syncObject的锁才能执行,具体机制与同步方法一致。由于可以针对任意代码块,且可以任意指定上锁的对象,故灵活性较高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值