java多线程——线程安全

概述

  • 什么是线程安全问题
    • 多个线程执行的不确定性引起执行结果的不稳定
    • 多个线程对账本的共享(共享数据),会造成操作的不完整性,会破坏数据
  • 例子:之前卖票的例子,最后可能出现错票,即100张票,票号只可能是100~0,但是最后出现了票号为-1的票。或者出现重票,即有3张票号都为100的票的情况。
    • 原因:当某个线程操作车票的过程中,尚未操作完成,其他线程也参与了进来,也对车票进行操作
      在这里插入图片描述
  • 如何解决:当一个线程a在操作共享数据(ticket)的时候,其他线程不能参与进来。直到线程a操作完共享的数据(ticket),其他线程才可以参与进来,继续操作共享数据(ticket)。这种情况即使在线程a出现了阻塞,也不能改变。
  • 在java中,我们通过同步机制,来解决线程的安全问题
    • 方式一:同步代码块
    • 方式二:同步方法

同步代码块

  • 语法:
synchronized(同步监视器){
	//需要被同步的代码
}
  • 说明:
    • 操作共享数据的代码,即为需要被同步的代码(包含的代码不能多也不能少)
    • 共享数据:多个线程同时操作的数据(例如卖票例子中的ticket)
    • 同步监视器:俗称。任何一个类的的对象,都可以充当为锁
      • 要求多个线程必须要共用同一把锁

总结

  • 使用同步的方式解决线程问题的好处与局限性
    • 好处:同步的方式,解决了线程的安全问题
    • 局限性:操作同步代码块的时候,只能有一个线程参与,其他线程等待。相当于是一个单线程的过程,效率较低。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值