我把所有Java相关的面试题和答案都整理成了PDF,并且带书签目录,阅读起来非常方便

面试题及答案PDF下载点击下载Java面试手册

面试题及答案PDF下载点击下载Java面试手册

面试题及答案PDF下载点击下载Java面试手册

1. 为什么wait, notify 和 notifyAll这些方法不在thread类里面?

一个很明显的原因是JAVA提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得。由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object类中因为锁属于对象。

2. synchronized包括哪两个jvm重要的指令?

monitor enter 和 monitor exit

3. 为什么wait和notify方法要在同步块中调用?

Java API强制要求这样做,如果你不这么做,你的代码会抛出IllegalMonitorStateException异常。还有一个原因是为了避免wait和notify之间产生竞态条件。

4. 现在有 T1、T2、T3 三个线程,你怎样保证 T2 在 T1 执行完后执行,T3 在 T2 执行完后执 行?

这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟 悉。这个多线程问题比较简单,可以用 join 方法实现。

public class JoinTestSync {
    public static void main(String[] args) throws InterruptedException {
        // TODO Auto-generated method stub
        ThreadJoinTest1 t1 = new ThreadJoinTest1("今天");
        ThreadJoinTest1 t2 = new ThreadJoinTest1("明天");
        ThreadJoinTest1 t3 = new ThreadJoinTest1("后天");
        /*
         * 通过join方法来确保t1、t2、t3的执行顺序
         * */
        t1.start();
        t1.join();    
        t2.start();
        t2.join();
        t3.start();
        t3.join();
    }
    


}




class ThreadJoinTest1 extends Thread{
    public ThreadJoinTest1(String name){
        super(name);
    }
    @Override
    public void run(){
        for(int i=0;i<5;i++){
            System.out.println(this.getName() + ":" + i);
        }
    }
}

5. 什么是Daemon线程?它有什么意义?

所谓后台(daemon)线程,是指在程序运行的时候在后台提供一种通用服务的线程,并且这个线程并不属于程序中不可或缺的部分。因此,当所有的非后台线程结束时,程序也就终止了,同时会杀死进程中的所有后台线程。

反过来说, 只要有任何非后台线程还在运行,程序就不会终止。必须在线程启动之前调用setDaemon()方法,才能把它设置为后台线程。**注意:**后台进程在不执行finally子句的情况下就会终止其run()方法。

比如:JVM的垃圾回收线程就是Daemon线程,Finalizer也是守护线程。

后面的问题,大家可以先自己独立思考一下。

另外我把所有Java相关的面试题和答案都整理出来了,给大家参考一下

面试题及答案PDF下载点击下载Java面试手册

面试题及答案PDF下载点击下载Java面试手册

面试题及答案PDF下载点击下载Java面试手册

6. 向线程池提交任务

7. # 3、同步类

8. 常用的线程池模式以及不同线程池的使用场景?

9. synchronized锁的是什么?

10. 多线程和单线程的区别和联系?

11. 你如何确保main()方法所在的线程是Java 程序最后结束的线程?

12. Runnable接口和Callable接口的区别

13. Java中notify 和 notifyAll有什么区别?

14. ConcurrentHashMap的并发度是什么

15. 说一说自己对于 synchronized 关键字的了解

16. 当一个线程进入某个对象的一个synchronized的实例方法后,其它线程是否可进入此对象的其它方法?

17. 关闭线程池

18. Java中的同步集合与并发集合有什么区别?

19. ThreadLocal原理,使用注意点,应用场景有哪些?

20. 线程中断是否能直接调用stop,为什么?

21. 什么是并发容器的实现?

22. 什么是 FutureTask

23. 举例说明同步和异步。

24. 如何停止一个正在运行的线程

25. 如何创建线程池

26. 高并发、任务执行时间短的业务怎样使用线程池?并发不高、任务执行时间长的业务怎样使用线程池?并发高、业务执行时间长的业务怎样使用线程池?

27. 创建线程池参数有哪些,作用?

28. synchronized和ReentrantLock的区别

29. 线程池作用

30. Java Concurrency API中的Lock接口(Lock interface)是什么?对比同步它有什么优势?

31. 什么是ThreadLocal变量?

32. 什么是竞态条件?你怎样发现和解决竞争?

33. 在java中守护线程和本地线程区别?

34. 线程的sleep()方法和yield()方法有什么区别?

35. 用户线程和守护线程有什么区别?

36. Java中你怎样唤醒一个阻塞的线程?

37. Thread.sleep(0)的作用是什么

38. join方法传参和不传参的区别?

39. # 4、同步this实例

40. wait 和 sleep 方法的不同?

41. # 2、同步静态方法

42. 同步方法和同步块,哪个是更好的选择

43. Synchronized 有几种用法?

44. ThreadLocal是什么

45. 什么是 Callable 和 Future?

46. Thread类中的yield方法有什么作用?

47. 在线程中你怎么处理不可控制异常?

48. 如何在两个线程之间共享数据

49. Java中堆和栈有什么不同?

50. 线程池工作流程

51. Java中interrupted 和 isInterrupted方法的区别?

52. volatile关键字的作用

53. Java中原子操作更新字段类,Atomic包提供了哪几个类?

54. 同步方法和同步块,哪个是更好的选择?

55. 在Java中CycliBarriar和CountdownLatch有什么区别?

56. 为什么wait()方法和notify()/notifyAll()方法要在同步块中被调用

57. 请说出与线程同步以及线程调度相关的方法。

58. # 5、同步对象实例

59. 如何控制某个方法允许并发访问线程的大小?

60. 线程有哪些基本状态?

61. 并行和并发有什么区别?

62. 什么是阻塞式方法?

63. start()方法和run()方法的区别

64. 讲一下 synchronized 关键字的底层原理

65. 什么是线程安全?

66. Java中interrupted 和isInterruptedd方法的区别?

67. 什么是原子操作?在Java Concurrency API中有哪些原子类(atomic classes)?

68. 什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing)?

69. 一个线程如果出现了运行时异常会怎么样

70. 什么是Java Timer 类?如何创建一个有特定时间间隔的任务?

71. SynchronizedMap和ConcurrentHashMap有什么区别?

72. 如何在两个线程间共享数据?

73. ThreadLocal有什么用

74. 如何让正在运行的线程暂停一段时间?

75. 为什么代码会重排序?

76. 你如何在Java中获取线程堆栈?

77. volatile 变量和 atomic 变量有什么不同?

78. 线程类的构造方法、静态块是被哪个线程调用的

79. 线程同步和互斥有几种实现方法,都是什么?

80. CopyOnWriteArrayList可以用于什么应用场景?

81. Executor框架的主要成员

82. 如何确保线程安全?

83. 为什么wait(), notify()和notifyAll ()必须在同步方法或者同步块中被调用?

84. 线程的创建方式

85. join方法的作用?

86. 为什么使用Executor框架比使用应用创建和管理线程好?

87. 为什么使用Executor框架?

88. notify()和notifyAll()有什么区别?

89. 简述线程、程序、进程的基本概念。以及他们之间关系是什么?

90. Java中的死锁

91. 为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?

92. 如何创建守护线程?以及在什么场合来使用它?

93. 在多线程中,什么是上下文切换(context-switching)?

94. sleep方法和wait方法有什么区别

95. 怎么检测一个线程是否拥有锁?

96. 什么是阻塞队列?阻塞队列的实现原理是什么?如何使用阻塞队列来实现生产者-消费者模型?

97. 什么是线程池? 为什么要使用它?

98. 如何避免死锁和检测

99. Java中如何获取到线程dump文件

100. join方法实现原理

101. 什么是Java内存模型

102. 如何合理的设置线程池

103. wait()方法和notify()/notifyAll()方法在放弃对象监视器时有什么区别

104. 什么是阻塞(Blocking)和非阻塞(Non-Blocking)?

105. 线程的状态

106. 什么是可重入锁(ReentrantLock)?

107. 乐观锁和悲观锁的理解及如何实现,有哪些实现方式?

108. 为什么Thread类的sleep()和yield ()方法是静态的?

109. 不使用stop停止线程?

110. 你对线程优先级的理解是什么?

111. 死锁与活锁的区别,死锁与饥饿的区别?

112. 什么是多线程中的上下文切换?

113. Java线程池中submit() 和 execute()方法有什么区别?

114. Java中活锁和死锁有什么区别?

115. 什么是不可变对象,它对写并发应用有什么帮助?

116. join与start调用顺序问题

117. 说说自己是怎么使用 synchronized 关键字,在项目中用到了吗synchronized关键字最主要的三种使用方式:

118. 一个线程运行时发生异常会怎样?

119. # 1、同步普通方法

120. 什么是线程池?为什么要使用它?

121. 什么是线程安全

122. 什么是自旋

123. 什么是Executors框架?

124. 自旋锁的优缺点?

125. volatile 是什么?可以保证有序性吗?

126. 多线程有什么用?

127. 线程的状态转换?

128. Java中用到的线程调度算法是什么?

129. Java中Semaphore是什么?

130. 在Java中Executor、ExecutorService、Executors的区别?

131. 线程安全的级别