java并发面试题(一)基础

本文整理了常见的Java并发面试题,希望对大家面试有所帮助,欢迎大家互相交流。

多线程

  1. java中有几种方法可以实现一个线程?
  2. 如何停止一个正在运行的线程?
  3. notify()和notifyAll()有什么区别?
  4. sleep()和 wait()有什么区别?
  5. 什么是Daemon线程?它有什么意义?
  6. java如何实现多线程之间的通讯和协作?

  1. 什么是可重入锁(ReentrantLock)?
  2. 当一个线程进入某个对象的一个synchronized的实例方法后,其它线程是否可进入此对象的其它方法?
  3. synchronized和java.util.concurrent.locks.Lock的异同?
  4. 乐观锁和悲观锁的理解及如何实现,有哪些实现方式?

并发框架

  1. SynchronizedMap和ConcurrentHashMap有什么区别?
  2. CopyOnWriteArrayList可以用于什么应用场景?

线程安全

  1. 什么叫线程安全?servlet是线程安全吗?
  2. 同步有几种实现方法?
  3. volatile有什么用?能否用一句话说明下volatile的应用场景?
  4. 请说明下java的内存模型及其工作流程。
  5. 为什么代码会重排序?

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: java并发面试题(一)基础

公 泰

袁超,淘宝研发工程师,花名公泰。

Latest posts by 公 泰 (see all)

FavoriteLoading添加本文到我的收藏
  • Trackback are closed
  • Comments (23)
    • 杰iter
    • 03/10. 2013 5:14pm

    答案呢。。。。

    • 小Q
    • 03/12. 2013 7:15pm

    最好能附上答案

    • nicky
    • 03/17. 2013 5:32pm

    1 应该是可以继承Thread类, 或者实现Runnable接口吧
    2 STOP方法?
    3 notify和notifyall 这个还真的不怎么清楚,notify是唤醒一个线程,notifyall是唤醒所有的等待线程?
    4 只用过SLEEP方法,wait在个人感觉应该是会把该线程从执行队列移出队列到等待队列中吧
    5 , 6 都不知道哎

      • 宅男小何
      • 03/18. 2013 9:55am

      如何停止一个线程?
      最好的办法是设置一个变量,在外面改变这个变量,然后线程每次运行的时候检查这个变量的值。
      如果直接用stop方法容易引起死锁的问题,

      • 这里需要做些纠正,我不知道为什么很多人说stop会导致死锁,但这个说法实在是有问题。stop方法被弃用,并不是因为会导致死锁的缘故,事实上,调用stop后,被stop的线程会抛出一个ThreadDeath错误,如果这个时候线程持有锁的话,它会像遇到一般异常一样处理,并不会有死锁的问题发生。它被弃用的主要原因在于会导致对象状态不一致。而suspend和resume确实会导致死锁。

        • 被弃用的主要原因在于会导致对象状态不一致,您说的这个对象指的是“锁”是吗?

    • tsingxu
    • 03/20. 2013 5:24pm

    1 通过创建Thread
    2 条件变量
    3 随机唤醒和唤醒全部
    4 定时等待和在监视器上等待,不同范畴
    5 守护线程,不需要上层逻辑介入的后台线程 ,比如GC
    6 中断和 直接或间接访问对方实例

    1 更高级的锁,附加更多特性
    2 可进入非synchronized方法
    3 后者具有更丰富的特性
    4 乐观锁是假设我已经拿到锁,悲观所是我必须拿到锁,前者用CAS,后者用mutex

    1 后者具有更高的并发
    2 多读少写

    1 在多线程调用情况下,依然表现正常
    2 锁和volatile
    3 保持可见性,在1写N读的情况下比较适合
    4 太多了,我只知道一些
    5 编译器旨在提升性能

    • 答得不错,ReentrantLock和JMM可以再补充下。

        • tsingxu
        • 03/21. 2013 11:07am

        1 ReentrantLock 相对于固有锁synchronized,同样是可重入的,在某些vm版本上提供了比固有锁更高的性能,提供了更丰富的锁特性,比如可中断的锁,可等待的锁,平等锁以及非块结构的加锁。从代码上尽量用固有锁,vm会对固有锁做一定的优化,并且代码可维护和稳定。只有在需要ReentrantLock的一些特性时,可以考虑用ReentrantLock实现。

        2 JVM的内存模型可简单理解为,有一块整个JVM共享的主内存,每个线程有自己的变量复本,线程持有的复本与主内存之间使用内部的数据协议,再具体可参考一些blog和周志明的深入理解JVM12章

    • 张蒙蒙
    • 03/27. 2013 9:45am

    ReentrantLock 和synchronized比较:
    性能上:
    synchronized在Java5.0性能大胜synchronized,Java 6中synchronized 略有胜出—-摘自《java并发编程实战》(13.4)
    当时我说synchronized在今后的JVM(JIT)优化的可能性比ReentrantLock大,回来后我翻翻资料,发现在ReentrantLock 和synchronized还真有一些需要了解的知识,所以特别整理下发给大家。
    1.为什么JUC框架出现LOCK?
    ReentrantLock并不是替代synchronized的方法,而是当内置锁不适用时,作为一种可选的高级功能。
    2.那么Synchronized有哪些缺点?
    ①. 只有一个condition与锁相关联,这个condition是什么?就是synchronized对针对的对象锁。
    ②. synchronized无法中断一个正在等待获得锁的线程,也即多线程竞争一个锁时,其余未得到锁的线程只能不停的尝试获得锁,而不能中断。这种情况对于大量的竞争线程会造成性能的下降等后果。
    可见ReentrantLock 是对synchronized补充。
    3.我们面对ReentrantLock和synchronized改如何选择?
    Synchronized相比Lock,为许多开发人员所熟悉,并且简洁紧凑,如果现有程序已经使用了内置锁,那么尽量保持代码风格统一,尽量不引入Lock,避免两种机制混用,容易令人困惑,也容易发生错误。
    在Synchronized无法满足需求的情况下,Lock可以作为一种高级工具,这些功能包括“可定时的、可轮询的与可中断的锁获取操作,公平队列,以及非块结构的锁”否则还是优先使用Synchronized。
    最后,未来更可能提升Synchronized而不是Lock的性能,因为Synchronized是JVM的内置属性,他能执行一些优化,例如对线程封闭的锁对象的锁消除优化,通过增加锁的粒度来消除内置锁的同步,而如果基于类库的锁来实现这些功能,则可能性不大。—以上建议摘自《java并发编程实战》(13.4)

    • wkiskey
    • 08/20. 2013 6:14pm

    果然是个好网站

    • wkiskey
    • 08/20. 2013 6:16pm

    果然是学习必备啊

    • Anonymous
    • 12/02. 2013 1:14pm

    1.

    • Anonymous
    • 12/29. 2013 12:17pm

    多线程

    1. java中有几种方法可以实现一个线程?
    可以使用Runnable,Callable,Thread或者线程池
    2. 如何停止一个正在运行的线程?
    可以使用正在运行的线程,支持线程中断,那么可以使用线程中断的方法停止这个线程;通常是定义一个volatile的状态变量,在运行线程线程中读这个变量,其它线程中修改这个变量
    3. notify()和notifyAll()有什么区别?
    notify是随机唤醒一个等待某个资源的线程,进入就绪队列等待CPU的调度,notifyAll是唤醒所有的,进入就绪队列等待CPU调度
    4.sleep()和 wait()有什么区别?
    sleep()是当前正在运行的线程主动放弃CPU,进入睡眠状态,如果此时线程已经持有一个锁,则释放这个锁
    wait()是等待其它其它线程对某个共享资源的锁释放,等待期间,仍然持有它已经获得的同步锁,这个就是典型的两个线程互相等待对方持有的资源以致死锁的原因
    5.什么是Daemon线程?它有什么意义?
    守护线程是后台线程,它通常属于低优先级的线程,守护用户线程,通常做一些垃圾清理的工作,比如GC。当所有的用户线程退出后,守护线程不会立即退出,还出执行一段时间,具体多少时间,有知道的告诉我。。。
    6.java如何实现多线程之间的通讯和协作?
    同步和互斥,资源互斥、协调竞争是要解决的因,同步是竞争协调的果。可以使用synchnized/notify/notifyAll以及Lock/Condition, CyclicBarrier/Semaphore/Countdownbatch。线程的join以及Future/FutureTask是为了解决多线程计算后的结果统计

      • Anonymous
      • 03/18. 2014 2:16pm

      第四点回答有误,sleep的时候锁并没有被释放;而wait将当前线程挂起,并释放锁。

        • 丰富
        • 04/15. 2014 6:02pm

        没错,sleep方法是在指定的时间内让正在执行的线程暂停执行,但不会释放锁。而wait方法是让当前线程等待,直到其他线程调用对象的notify或notifyAll方法。wait方法会释放掉锁,使别的线程有机会占用锁。

    • Anonymous
    • 12/29. 2013 12:25pm

    1. 什么是可重入锁(ReentrantLock)?
    2. 当一个线程进入某个对象的一个synchronized的实例方法后,其它线程是否可进入此对象的其它方法?
    能否进入关键是看其它方法是否是同步于此对象
    3. synchronized和java.util.concurrent.locks.Lock的异同?

    4. 乐观锁和悲观锁的理解及如何实现,有哪些实现方式?
    乐观锁,每次操作时不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止
    悲观锁是会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。
    乐观锁可以使用volatile+CAS原语实现
    悲观锁可以使用synchronize的以及Lock。

    • Anonymous
    • 12/29. 2013 12:33pm

    纠正下。。。

    sleep()是当前正在运行的线程主动放弃CPU,进入睡眠状态,如果此时线程已经持有一个锁,则释放这个锁。。。。应该是说,sleep的线程不会释放它已获得的锁。

  1. 囧,竟然有3道题目不会。。。不开心啊,继续努力了

  2. 竟然有3道题目不会。。囧,不开心啊。。

    • 程序员小董
    • 04/15. 2016 10:31am

    并发编程网的内容都很好
    但是我有一个小建议
    版面布局能不能修改一下
    整个屏幕有一小半是被右边的推荐文章和左边的文章信息占用了
    这个能不能优化一下?

You must be logged in to post a comment.

return top