目录
线程的并发性和同步化
并发性
- 并发性问题会引发竞争状态,竞争状态会引发数据的损毁。这一切问题来自:两个或以上线程存取单一对象的数据,也就是说两个不同执行空间上的方法都对堆上同一个对象执行getter和setter方法。
- 如何理解呢?丈夫A,妻子B,他们只有一个银行账户。A想买一个手机,B想买一个名牌包包。A查看了一下银行余额,十万,自己用五万买个手机,于是很开心,就去睡觉了。B在A睡觉期间,看中了一个包包,就花十万买了包。第二天醒来,A已经到了手机店,买好手机,正要付款时发现余额不足。。。
- 所以我们该怎么解决这个并发性的问题?给夫妻两都添加一个先查余额的方法?这样做是不是有点浪费资源?
于是就引出了第二个概念,同步化。
同步化
- 我们使用synchronized这个关键词修饰方法,使方法每次只能被单一的线程存取,这就是上锁。
- 使用对象的锁,每一个对象都有一个锁,大部分时间都没有锁上,并且你可以假设有个虚拟的钥匙在旁边。对象的锁只会在有同步化的方法上起作用,当对象有一个或多个同步化方法时,线程只有在取得对象锁的钥匙时才能进入同步化方法。
- 一点线程进入了方法,我们必须确保其他线程可以进入在方法之前,这个线程的所有步骤都会完成(原子性)。
同步化的死亡阴影(线程死锁)
- 使用同步化的程序代码要小心,因为没有其他的东西能够像线程的死锁这样伤害你的程序。死锁会发生是因为两个线程互相持有对方需要或者正在登台的东西,没有方法可以脱离这个情况,所以两个线程只好停下来等,一直等。
- 数据库虽说也有这样的死锁情况,但是相比java,数据库有事务这个处理机制,用来对死锁情况进行回滚机制,但是java没有处理死锁的机制。
- 如果还是不好理解,我们借助画图工具,来更加形象的理解死锁发生的情况。
这样,我们对线程的运作机制以及会遇到的问题就有了初步的了解。
感谢浏览,希望对你有所帮助。