java并发面试题(七)

Source
  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. 线程状态有几种?
    答:可参考本篇博客【线程的状态到底有几种?】。

发布了213 篇原创文章 · 获赞 214 · 访问量 3万+