java并发面试题(七)

白昼怎懂夜的黑 提交于 2020-02-28 03:29:19
  1. 重写run()方法时可以对外抛出异常么?
    答:不行,因为被重写的run()方法自身就没有抛出异常的定义,所以run()方法里要是有异常,在内部就要try/catch了。

  2. 线程可以连续调用两次start方法么?
    答:可参考本篇博客线程连续两次调用start()方法

  3. 简述锁的等级方法锁、对象锁、类锁?
    答:首先要了解每个对象都有一个可以用来实现同步的锁,称为内置锁。方法锁和对象锁指的其实是同一个东西,只是synchronized关键字使用的地方不同而已,都是作用于实例对象,所以如果是相同类的不同实例,它们的锁也是不同的。而类也是一个特殊的对象,类锁就是作用于类上的锁,比如静态同步方法的锁就是类锁,这时候再多的实例,只要它们归属的类是相同的,那抢的就是同一把锁。

  4. 多线程的价值?
    答:首先可以充分利用多核CPU的优势,其次可以防止阻塞,完全可以在一个任务阻塞时,先做其他的任务,然后等第一个任务返回后再做统合,最后使用多线程可以对任务进行拆解,把一个大任务拆分成几个小任务运行,当然,能否成功拆解还是要看具体的业务逻辑。

  5. 锁机制有什么用?
    答:多线程情况下,保证信息的同步,结果的正确。

  6. 请说出你所知的线程同步的方法?
    答:
    wait() : 使一个线程处于等待状态,并且释放所持有的对象的锁。
    sleep() : 使一个正在运行的线程处于睡眠状态(睡眠可以理解成睡到一定时间线程自己就会醒),所以线程不会释放所持有的对象的锁,而且调用此方法要捕捉InterruptedException异常。
    notify():唤醒一个处于等待状态的线程,由JVM决定唤醒哪个线程,不能指定,完全看运气。
    notifyAll():唤醒所有处入等待状态的线程,让这些线程一起去竞争锁。

  7. 什么场景下可以使用volatile替换synchronized?
    答:只需要保证共享资源的可见性的时候可以使用volatile替代,synchronized保证可操作的原子性一致性和可见性。 volatile适用于新值不依赖于旧值的情况。

  8. volatile是否能保证数组中元素的可见性?
    答:不行,volatile只对数组的引用起作用,而不是它里面的元素。

  9. 如何让一段程序并发的执行,并最终汇总结果?
    答:join()方法,CyclicBarrier以及CountDownLatch。

  10. 线程状态有几种?
    答:可参考本篇博客【线程的状态到底有几种?】。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!