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

近5年常考Java面试题及答案整理(二)

发布时间:2020-12-24 16:14:41 所属栏目:交互 来源:网络整理
导读:div id="article_content" class="article_content clearfix csdn-tracking-statistics" data-pid="blog" data-mod="popu_307" data-dsm="post" div id="content_views" class="htmledit_views" 上一篇: 31、String s = new String("xyz");创建了几个字符串

银行账户类:

balance; deposit( newBalance = balance + Thread.sleep(10); balance = }

存钱线程类:

AddMoneyThread Account account; money; AddMoneyThread(Account account, .account = .money = }

测试类:

Account account = ExecutorService service = Executors.newFixedThreadPool(100 ( i = 1; i <= 100; i++ service.execute( AddMoneyThread(account,1 (! System.out.println("账户余额: " + }

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

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

balance; deposit( newBalance = balance + Thread.sleep(10); balance = }

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

AddMoneyThread Account account; money; AddMoneyThread(Account account, .account = .money = }

通过Java 5显示的锁机制,为每个银行账户创建一个锁对象,在存款操作进行加锁和解锁的操作

Lock accountLock = balance; deposit( newBalance = balance + Thread.sleep(10); balance = }

按照上述三种方式对代码进行修改后,重写执行测试代码Test01,将看到最终的账户余额为100元。当然也可以使用Semaphore或CountdownLatch来实现同步。

61、编写多线程程序有几种实现方式?

答:Java 5以前实现多线程有两种实现方法:一种是继承Thread类;另一种是实现Runnable接口。两种方式都要通过重写run()方法来定义线程的行为,推荐使用后者,因为Java中的继承是单继承,一个类有一个父类,如果继承了Thread类就无法再继承其他类了,显然使用Runnable接口更为灵活。

补充:Java 5以后创建线程还有第三种方式:实现Callable接口,该接口中的call方法可以在线程执行结束时产生一个返回值,代码如下所示:

<span style="color: #0000ff;">class MyTask <span style="color: #0000ff;">implements Callable<span style="color: #000000;"> {
<span style="color: #0000ff;">private <span style="color: #0000ff;">int<span style="color: #000000;"> upperBounds;

</span><span style="color: #0000ff;"&gt;public</span> MyTask(<span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; upperBounds) {
    </span><span style="color: #0000ff;"&gt;this</span>.upperBounds =<span style="color: #000000;"&gt; upperBounds;
}

@Override
</span><span style="color: #0000ff;"&gt;public</span> Integer call() <span style="color: #0000ff;"&gt;throws</span><span style="color: #000000;"&gt; Exception {
    </span><span style="color: #0000ff;"&gt;int</span> sum = 0<span style="color: #000000;"&gt;; 
    </span><span style="color: #0000ff;"&gt;for</span>(<span style="color: #0000ff;"&gt;int</span> i = 1; i <= upperBounds; i++<span style="color: #000000;"&gt;) {
        sum </span>+=<span style="color: #000000;"&gt; i;
    }
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; sum;
}

}

<span style="color: #0000ff;">class<span style="color: #000000;"> Test {

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span> main(String[] args) <span style="color: #0000ff;"&gt;throws</span><span style="color: #000000;"&gt; Exception {
    List</span><Future<Integer>> list = <span style="color: #0000ff;"&gt;new</span> ArrayList<><span style="color: #000000;"&gt;();
    ExecutorService service </span>= Executors.newFixedThreadPool(10<span style="color: #000000;"&gt;);
    </span><span style="color: #0000ff;"&gt;for</span>(<span style="color: #0000ff;"&gt;int</span> i = 0; i < 10; i++<span style="color: #000000;"&gt;) {
        list.add(service.submit(</span><span style="color: #0000ff;"&gt;new</span> MyTask((<span style="color: #0000ff;"&gt;int</span>) (Math.random() * 100<span style="color: #000000;"&gt;))));
    }

    </span><span style="color: #0000ff;"&gt;int</span> sum = 0<span style="color: #000000;"&gt;;
    </span><span style="color: #0000ff;"&gt;for</span>(Future<Integer><span style="color: #000000;"&gt; future : list) {
        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; while(!future.isDone()) ;</span>
        sum +=<span style="color: #000000;"&gt; future.get();
    }

    System.out.println(sum);
}

}

62、synchronized关键字的用法?

(编辑:武汉站长网)

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

热点阅读