加入收藏 | 设为首页 | 会员中心 | 我要投稿 好传媒网 (https://www.haochuanmei.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 交互 > 正文

史上最全Java面试题整理(附参考答案)

发布时间:2020-12-24 10:36:47 所属栏目:交互 来源:网络整理
导读:下列面试题都是在网上收集的,本人抱着学习的态度找了下参考答案,有不足的地方还请指正,更多精彩内容可以关注我的微信公众号:Java团长 1、面向对象的特征有哪些方面? 抽象:将同类对象的共同特征提取出来构造类。 继承:基于基类创建新类。 封装:将数据

}

<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler" title="点击并拖拽以移动" src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==" alt="" width="15" height="15" data-cke-widget-drag-handler="1">

在没有同步的情况下,执行结果通常是显示账户余额在10元以下,出现这种状况的原因是,当一个线程A试图存入1元的时候,另外一个线程B也能够进入存款的方法中,线程B读取到的账户余额仍然是线程A存入1元钱之前的账户余额,因此也是在原来的余额0上面做了加1元的操作,同理线程C也会做类似的事情,所以最后100个线程执行结束时,本来期望账户余额为100元,但实际得到的通常在10元以下(很可能是1元哦)。解决这个问题的办法就是同步,当一个线程对银行账户存钱时,需要将此账户锁定,待其操作完成后才允许其他的线程进行操作,代码有如下几种调整方案:

在银行账户的存款(deposit)方法上加同步(synchronized)关键字

<span class="hljs-comment"&gt;/** * 存款 * <span class="hljs-doctag"&gt;@param money 存入金额 */ <span class="hljs-function"&gt;<span class="hljs-keyword"&gt;public <span class="hljs-keyword"&gt;synchronized <span class="hljs-keyword"&gt;void <span class="hljs-title"&gt;deposit<span class="hljs-params"&gt;(<span class="hljs-keyword"&gt;double money) { <span class="hljs-keyword"&gt;double newBalance = balance + money; <span class="hljs-keyword"&gt;try { Thread.sleep(<span class="hljs-number"&gt;10); <span class="hljs-comment"&gt;// 模拟此业务需要一段处理时间 } <span class="hljs-keyword"&gt;catch(InterruptedException ex) { ex.printStackTrace(); } balance = newBalance; } <span class="hljs-comment"&gt;/** * 获得账户余额 */ <span class="hljs-function"&gt;<span class="hljs-keyword"&gt;public <span class="hljs-keyword"&gt;double <span class="hljs-title"&gt;getBalance<span class="hljs-params"&gt;() { <span class="hljs-keyword"&gt;return balance; }

}

<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler" title="点击并拖拽以移动" src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==" alt="" width="15" height="15" data-cke-widget-drag-handler="1">

在线程调用存款方法时对银行账户进行同步

<span class="hljs-function"&gt;<span class="hljs-keyword"&gt;public <span class="hljs-title"&gt;AddMoneyThread<span class="hljs-params"&gt;(Account account,<span class="hljs-keyword"&gt;double money) { <span class="hljs-keyword"&gt;this.account = account; <span class="hljs-keyword"&gt;this.money = money; } <span class="hljs-meta"&gt;@Override <span class="hljs-function"&gt;<span class="hljs-keyword"&gt;public <span class="hljs-keyword"&gt;void <span class="hljs-title"&gt;run<span class="hljs-params"&gt;() { <span class="hljs-keyword"&gt;synchronized (account) { account.deposit(money); } }

(编辑:好传媒网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读