线程调度和同步化(2)

目录

 

线程的并发性和同步化

并发性

同步化

同步化的死亡阴影(线程死锁)


线程的并发性和同步化

并发性

  • 并发性问题会引发竞争状态,竞争状态会引发数据的损毁。这一切问题来自:两个或以上线程存取单一对象的数据,也就是说两个不同执行空间上的方法都对堆上同一个对象执行getter和setter方法。
  • 如何理解呢?丈夫A,妻子B,他们只有一个银行账户。A想买一个手机,B想买一个名牌包包。A查看了一下银行余额,十万,自己用五万买个手机,于是很开心,就去睡觉了。B在A睡觉期间,看中了一个包包,就花十万买了包。第二天醒来,A已经到了手机店,买好手机,正要付款时发现余额不足。。。
  • 所以我们该怎么解决这个并发性的问题?给夫妻两都添加一个先查余额的方法?这样做是不是有点浪费资源?

于是就引出了第二个概念,同步化。

同步化

  • 我们使用synchronized这个关键词修饰方法,使方法每次只能被单一的线程存取,这就是上锁。
  • 使用对象的锁,每一个对象都有一个锁,大部分时间都没有锁上,并且你可以假设有个虚拟的钥匙在旁边。对象的锁只会在有同步化的方法上起作用,当对象有一个或多个同步化方法时,线程只有在取得对象锁的钥匙时才能进入同步化方法。
  • 一点线程进入了方法,我们必须确保其他线程可以进入在方法之前,这个线程的所有步骤都会完成(原子性)。

同步化的死亡阴影(线程死锁)

  • 使用同步化的程序代码要小心,因为没有其他的东西能够像线程的死锁这样伤害你的程序。死锁会发生是因为两个线程互相持有对方需要或者正在登台的东西,没有方法可以脱离这个情况,所以两个线程只好停下来等,一直等。
  • 数据库虽说也有这样的死锁情况,但是相比java,数据库有事务这个处理机制,用来对死锁情况进行回滚机制,但是java没有处理死锁的机制。
  • 如果还是不好理解,我们借助画图工具,来更加形象的理解死锁发生的情况。

这样,我们对线程的运作机制以及会遇到的问题就有了初步的了解。

感谢浏览,希望对你有所帮助。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值