Java并发编程面试题 Top 50 整理版
<div class="blog-content-box"> <p>本文在 <a href="http://www.importnew.com/12773.html" rel="nofollow" target="_blank">Java线程面试题 Top 50</a>的基础上,对部分答案进行进行了整理和补充,问题答案主要来自《Java编程思想(第四版)》,《Java并发编程实战》和一些优秀的博客,当然还有我个人的拙见,添加部分大多用不同颜色进行了区别以方便阅读。</p>
<h2 id="%E5%89%8D%E8%A8%80"> 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发、调试、优化经验,所以线程相关的问题在面试中经常会被提到。 在典型的Java面试中, 面试官会从线程的基本概念问起,如:为什么你需要使用线程, 如何创建线程,用什么方式创建线程比较好(比如:),然后逐渐问到并发问题像在Java并发编程的过程中遇到了什么挑战,Java内存模型,JDK1.5引入了哪些更高阶的并发工具,并发编程常用的,经典多线程问题如生产者消费者,哲学家就餐,读写器或者简单的有界缓冲区问题。仅仅知道线程的基本概念是远远不够的, 你必须知道如何处理,,内存冲突和线程安全等并发问题。掌握了这些技巧,你就可以轻松应对多线程和并发面试了。 许多Java程序员在面试前才会去看面试题,这很正常。因为收集面试题和练习很花时间,所以我从许多面试者那里收集了Java多线程和并发相关的50个热门问题。我只收集了比较新的面试题且没有提供全部答案。想必聪明的你对这些问题早就心中有数了, 如果遇到不懂的问题,你可以用Google找到答案。若你实在找不到答案,可以在文章的评论中向我求助。你也可以在这找到一些答案。 下面是Java线程相关的热门面试题,你可以用它来好好准备面试。 <p id="main-toc">目录 <p id="1)%20%E4%BB%80%E4%B9%88%E6%98%AF%E7%BA%BF%E7%A8%8B%EF%BC%9F-toc" style="margin-left:40px;"><a href="#1)%20%E4%BB%80%E4%B9%88%E6%98%AF%E7%BA%BF%E7%A8%8B%EF%BC%9F" rel="nofollow" target="_self">1) 什么是线程? <p id="2)%20%E7%BA%BF%E7%A8%8B%E5%92%8C%E8%BF%9B%E7%A8%8B%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F-toc" style="margin-left:40px;"><a href="#2)%20%E7%BA%BF%E7%A8%8B%E5%92%8C%E8%BF%9B%E7%A8%8B%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F" rel="nofollow" target="_self">2) 线程和进程有什么区别? <p id="3)%20%E5%A6%82%E4%BD%95%E5%9C%A8Java%E4%B8%AD%E5%AE%9E%E7%8E%B0%E7%BA%BF%E7%A8%8B%EF%BC%9F-toc" style="margin-left:40px;"><a href="#3)%20%E5%A6%82%E4%BD%95%E5%9C%A8Java%E4%B8%AD%E5%AE%9E%E7%8E%B0%E7%BA%BF%E7%A8%8B%EF%BC%9F" rel="nofollow" target="_self">3) 如何在Java中实现线程? <p id="4)%20%E7%94%A8Runnable%E8%BF%98%E6%98%AFThread%EF%BC%9F-toc" style="margin-left:40px;"><a href="#4)%20%E7%94%A8Runnable%E8%BF%98%E6%98%AFThread%EF%BC%9F" rel="nofollow" target="_self">4) 用Runnable还是Thread? <p id="6)%20Thread%20%E7%B1%BB%E4%B8%AD%E7%9A%84start()%20%E5%92%8C%20run()%20%E6%96%B9%E6%B3%95%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F-toc" style="margin-left:40px;"><a href="#6)%20Thread%20%E7%B1%BB%E4%B8%AD%E7%9A%84start()%20%E5%92%8C%20run()%20%E6%96%B9%E6%B3%95%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F" rel="nofollow" target="_self">6) Thread 类中的start() 和 run() 方法有什么区别? <p id="7)%20Java%E4%B8%ADRunnable%E5%92%8CCallable%E6%9C%89%E4%BB%80%E4%B9%88%E4%B8%8D%E5%90%8C%EF%BC%9F-toc" style="margin-left:40px;"><a href="#7)%20Java%E4%B8%ADRunnable%E5%92%8CCallable%E6%9C%89%E4%BB%80%E4%B9%88%E4%B8%8D%E5%90%8C%EF%BC%9F" rel="nofollow" target="_self">7) Java中Runnable和Callable有什么不同? <p id="8)%20Java%E4%B8%ADCyclicBarrier%20%E5%92%8C%20CountDownLatch%E6%9C%89%E4%BB%80%E4%B9%88%E4%B8%8D%E5%90%8C%EF%BC%9F-toc" style="margin-left:40px;"><a href="#8)%20Java%E4%B8%ADCyclicBarrier%20%E5%92%8C%20CountDownLatch%E6%9C%89%E4%BB%80%E4%B9%88%E4%B8%8D%E5%90%8C%EF%BC%9F" rel="nofollow" target="_self">8) Java中CyclicBarrier 和 CountDownLatch有什么不同? <p id="9)%20Java%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F-toc" style="margin-left:40px;"><a href="#9)%20Java%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F" rel="nofollow" target="_self">9) Java内存模型是什么? <p id="10)%20Java%E4%B8%AD%E7%9A%84volatile%20%E5%8F%98%E9%87%8F%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F-toc" style="margin-left:40px;"><a href="#10)%20Java%E4%B8%AD%E7%9A%84volatile%20%E5%8F%98%E9%87%8F%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F" rel="nofollow" target="_self">10) Java中的volatile 变量是什么? <p id="11)%20%E4%BB%80%E4%B9%88%E6%98%AF%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%EF%BC%9FVector%E6%98%AF%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%B1%BB%E5%90%97%EF%BC%9F%20%EF%BC%88%E8%AF%A6%E8%A7%81%E8%BF%99%E9%87%8C)-toc" style="margin-left:40px;"><a href="#11)%20%E4%BB%80%E4%B9%88%E6%98%AF%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%EF%BC%9FVector%E6%98%AF%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%B1%BB%E5%90%97%EF%BC%9F%20%EF%BC%88%E8%AF%A6%E8%A7%81%E8%BF%99%E9%87%8C)" rel="nofollow" target="_self">11) 什么是线程安全?Vector是一个线程安全类吗? (详见这里) <p id="12)%20Java%E4%B8%AD%E4%BB%80%E4%B9%88%E6%98%AF%E7%AB%9E%E6%80%81%E6%9D%A1%E4%BB%B6%EF%BC%9F%20%E4%B8%BE%E4%B8%AA%E4%BE%8B%E5%AD%90%E8%AF%B4%E6%98%8E%E3%80%82-toc" style="margin-left:40px;"><a href="#12)%20Java%E4%B8%AD%E4%BB%80%E4%B9%88%E6%98%AF%E7%AB%9E%E6%80%81%E6%9D%A1%E4%BB%B6%EF%BC%9F%20%E4%B8%BE%E4%B8%AA%E4%BE%8B%E5%AD%90%E8%AF%B4%E6%98%8E%E3%80%82" rel="nofollow" target="_self">12) Java中什么是竞态条件? 举个例子说明。 <p id="13)%20Java%E4%B8%AD%E5%A6%82%E4%BD%95%E5%81%9C%E6%AD%A2%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%EF%BC%9F-toc" style="margin-left:40px;"><a href="#13)%20Java%E4%B8%AD%E5%A6%82%E4%BD%95%E5%81%9C%E6%AD%A2%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%EF%BC%9F" rel="nofollow" target="_self">13) Java中如何停止一个线程? <p id="14)%20%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E8%BF%90%E8%A1%8C%E6%97%B6%E5%8F%91%E7%94%9F%E5%BC%82%E5%B8%B8%E4%BC%9A%E6%80%8E%E6%A0%B7%EF%BC%9F-toc" style="margin-left:40px;"><a href="#14)%20%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E8%BF%90%E8%A1%8C%E6%97%B6%E5%8F%91%E7%94%9F%E5%BC%82%E5%B8%B8%E4%BC%9A%E6%80%8E%E6%A0%B7%EF%BC%9F" rel="nofollow" target="_self">14) 一个线程运行时发生异常会怎样? <p id="15%EF%BC%89%20%E5%A6%82%E4%BD%95%E5%9C%A8%E4%B8%A4%E4%B8%AA%E7%BA%BF%E7%A8%8B%E9%97%B4%E5%85%B1%E4%BA%AB%E6%95%B0%E6%8D%AE%EF%BC%9F-toc" style="margin-left:40px;"><a href="#15%EF%BC%89%20%E5%A6%82%E4%BD%95%E5%9C%A8%E4%B8%A4%E4%B8%AA%E7%BA%BF%E7%A8%8B%E9%97%B4%E5%85%B1%E4%BA%AB%E6%95%B0%E6%8D%AE%EF%BC%9F" rel="nofollow" target="_self">15) 如何在两个线程间共享数据? <p id="16)%20Java%E4%B8%ADnotify%20%E5%92%8C%20notifyAll%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F-toc" style="margin-left:40px;"><a href="#16)%20Java%E4%B8%ADnotify%20%E5%92%8C%20notifyAll%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F" rel="nofollow" target="_self">16) Java中notify 和 notifyAll有什么区别? <p id="17)%20%E4%B8%BA%E4%BB%80%E4%B9%88wait%2C%20notify%20%E5%92%8C%20notifyAll%E8%BF%99%E4%BA%9B%E6%96%B9%E6%B3%95%E4%B8%8D%E5%9C%A8thread%E7%B1%BB%E9%87%8C%E9%9D%A2%EF%BC%9F-toc" style="margin-left:40px;"><a href="#17)%20%E4%B8%BA%E4%BB%80%E4%B9%88wait%2C%20notify%20%E5%92%8C%20notifyAll%E8%BF%99%E4%BA%9B%E6%96%B9%E6%B3%95%E4%B8%8D%E5%9C%A8thread%E7%B1%BB%E9%87%8C%E9%9D%A2%EF%BC%9F" rel="nofollow" target="_self">17) 为什么wait,notify 和 notifyAll这些方法不在thread类里面? <p id="18)%20%E4%BB%80%E4%B9%88%E6%98%AFThreadLocal%E5%8F%98%E9%87%8F%EF%BC%9F-toc" style="margin-left:40px;"><a href="#18)%20%E4%BB%80%E4%B9%88%E6%98%AFThreadLocal%E5%8F%98%E9%87%8F%EF%BC%9F" rel="nofollow" target="_self">18) 什么是ThreadLocal变量? <p id="19)%20%E4%BB%80%E4%B9%88%E6%98%AFFutureTask%EF%BC%9F-toc" style="margin-left:40px;"><a href="#19)%20%E4%BB%80%E4%B9%88%E6%98%AFFutureTask%EF%BC%9F" rel="nofollow" target="_self">19) 什么是FutureTask? <p id="20)%20Java%E4%B8%ADinterrupted%20%E5%92%8C%20isInterruptedd%E6%96%B9%E6%B3%95%E7%9A%84%E5%8C%BA%E5%88%AB%EF%BC%9F-toc" style="margin-left:40px;"><a href="#20)%20Java%E4%B8%ADinterrupted%20%E5%92%8C%20isInterruptedd%E6%96%B9%E6%B3%95%E7%9A%84%E5%8C%BA%E5%88%AB%EF%BC%9F" rel="nofollow" target="_self">20) Java中interrupted 和 isInterruptedd方法的区别? <p id="21)%20%E4%B8%BA%E4%BB%80%E4%B9%88wait%E5%92%8Cnotify%E6%96%B9%E6%B3%95%E8%A6%81%E5%9C%A8%E5%90%8C%E6%AD%A5%E5%9D%97%E4%B8%AD%E8%B0%83%E7%94%A8%EF%BC%9F-toc" style="margin-left:40px;"><a href="#21)%20%E4%B8%BA%E4%BB%80%E4%B9%88wait%E5%92%8Cnotify%E6%96%B9%E6%B3%95%E8%A6%81%E5%9C%A8%E5%90%8C%E6%AD%A5%E5%9D%97%E4%B8%AD%E8%B0%83%E7%94%A8%EF%BC%9F" rel="nofollow" target="_self">21) 为什么wait和notify方法要在同步块中调用? <p id="22)%20%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%A0%E5%BA%94%E8%AF%A5%E5%9C%A8%E5%BE%AA%E7%8E%AF%E4%B8%AD%E6%A3%80%E6%9F%A5%E7%AD%89%E5%BE%85%E6%9D%A1%E4%BB%B6%3F-toc" style="margin-left:40px;"><a href="#22)%20%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%A0%E5%BA%94%E8%AF%A5%E5%9C%A8%E5%BE%AA%E7%8E%AF%E4%B8%AD%E6%A3%80%E6%9F%A5%E7%AD%89%E5%BE%85%E6%9D%A1%E4%BB%B6%3F" rel="nofollow" target="_self">22) 为什么你应该在循环中检查等待条件? <p id="23)%20Java%E4%B8%AD%E7%9A%84%E5%90%8C%E6%AD%A5%E9%9B%86%E5%90%88%E4%B8%8E%E5%B9%B6%E5%8F%91%E9%9B%86%E5%90%88%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F-toc" style="margin-left:40px;"><a href="#23)%20Java%E4%B8%AD%E7%9A%84%E5%90%8C%E6%AD%A5%E9%9B%86%E5%90%88%E4%B8%8E%E5%B9%B6%E5%8F%91%E9%9B%86%E5%90%88%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F" rel="nofollow" target="_self">23) Java中的同步集合与并发集合有什么区别? <p id="24%EF%BC%89%20Java%E4%B8%AD%E5%A0%86%E5%92%8C%E6%A0%88%E6%9C%89%E4%BB%80%E4%B9%88%E4%B8%8D%E5%90%8C%EF%BC%9F-toc" style="margin-left:40px;"><a href="#24%EF%BC%89%20Java%E4%B8%AD%E5%A0%86%E5%92%8C%E6%A0%88%E6%9C%89%E4%BB%80%E4%B9%88%E4%B8%8D%E5%90%8C%EF%BC%9F" rel="nofollow" target="_self">24) Java中堆和栈有什么不同? <p id="25%EF%BC%89%20%E4%BB%80%E4%B9%88%E6%98%AF%E7%BA%BF%E7%A8%8B%E6%B1%A0%EF%BC%9F%20%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E4%BD%BF%E7%94%A8%E5%AE%83%EF%BC%9F-toc" style="margin-left:40px;"><a href="#25%EF%BC%89%20%E4%BB%80%E4%B9%88%E6%98%AF%E7%BA%BF%E7%A8%8B%E6%B1%A0%EF%BC%9F%20%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E4%BD%BF%E7%94%A8%E5%AE%83%EF%BC%9F" rel="nofollow" target="_self">25) 什么是线程池? 为什么要使用它? <p id="26%EF%BC%89%20%E5%A6%82%E4%BD%95%E5%86%99%E4%BB%A3%E7%A0%81%E6%9D%A5%E8%A7%A3%E5%86%B3%E7%94%9F%E4%BA%A7%E8%80%85%E6%B6%88%E8%B4%B9%E8%80%85%E9%97%AE%E9%A2%98%EF%BC%9F-toc" style="margin-left:40px;"><a href="#26%EF%BC%89%20%E5%A6%82%E4%BD%95%E5%86%99%E4%BB%A3%E7%A0%81%E6%9D%A5%E8%A7%A3%E5%86%B3%E7%94%9F%E4%BA%A7%E8%80%85%E6%B6%88%E8%B4%B9%E8%80%85%E9%97%AE%E9%A2%98%EF%BC%9F" rel="nofollow" target="_self">26) 如何写代码来解决生产者消费者问题? <p id="27%EF%BC%89%20%E5%A6%82%E4%BD%95%E9%81%BF%E5%85%8D%E6%AD%BB%E9%94%81%EF%BC%9F-toc" style="margin-left:40px;"><a href="#27%EF%BC%89%20%E5%A6%82%E4%BD%95%E9%81%BF%E5%85%8D%E6%AD%BB%E9%94%81%EF%BC%9F" rel="nofollow" target="_self">27) 如何避免死锁? <p id="28)%20Java%E4%B8%AD%E6%B4%BB%E9%94%81%E5%92%8C%E6%AD%BB%E9%94%81%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F-toc" style="margin-left:40px;"><a href="#28)%20Java%E4%B8%AD%E6%B4%BB%E9%94%81%E5%92%8C%E6%AD%BB%E9%94%81%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F" rel="nofollow" target="_self">28) Java中活锁和死锁有什么区别? <p id="29%EF%BC%89%20%E6%80%8E%E4%B9%88%E6%A3%80%E6%B5%8B%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E6%98%AF%E5%90%A6%E6%8B%A5%E6%9C%89%E9%94%81%EF%BC%9F-toc" style="margin-left:40px;"><a href="#29%EF%BC%89%20%E6%80%8E%E4%B9%88%E6%A3%80%E6%B5%8B%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E6%98%AF%E5%90%A6%E6%8B%A5%E6%9C%89%E9%94%81%EF%BC%9F" rel="nofollow" target="_self">29) 怎么检测一个线程是否拥有锁? <p id="30)%20%E4%BD%A0%E5%A6%82%E4%BD%95%E5%9C%A8Java%E4%B8%AD%E8%8E%B7%E5%8F%96%E7%BA%BF%E7%A8%8B%E5%A0%86%E6%A0%88%EF%BC%9F-toc" style="margin-left:40px;"><a href="#30)%20%E4%BD%A0%E5%A6%82%E4%BD%95%E5%9C%A8Java%E4%B8%AD%E8%8E%B7%E5%8F%96%E7%BA%BF%E7%A8%8B%E5%A0%86%E6%A0%88%EF%BC%9F" rel="nofollow" target="_self">30) 你如何在Java中获取线程堆栈? <p id="31)%20JVM%E4%B8%AD%E5%93%AA%E4%B8%AA%E5%8F%82%E6%95%B0%E6%98%AF%E7%94%A8%E6%9D%A5%E6%8E%A7%E5%88%B6%E7%BA%BF%E7%A8%8B%E7%9A%84%E6%A0%88%E5%A0%86%E6%A0%88%E5%B0%8F%E7%9A%84-toc" style="margin-left:40px;"><a href="#31)%20JVM%E4%B8%AD%E5%93%AA%E4%B8%AA%E5%8F%82%E6%95%B0%E6%98%AF%E7%94%A8%E6%9D%A5%E6%8E%A7%E5%88%B6%E7%BA%BF%E7%A8%8B%E7%9A%84%E6%A0%88%E5%A0%86%E6%A0%88%E5%B0%8F%E7%9A%84" rel="nofollow" target="_self">31) JVM中哪个参数是用来控制线程的栈堆栈小的 <p id="32%EF%BC%89%20Java%E4%B8%ADsynchronized%20%E5%92%8C%20ReentrantLock%20%E6%9C%89%E4%BB%80%E4%B9%88%E4%B8%8D%E5%90%8C%EF%BC%9F-toc" style="margin-left:40px;"><a href="#32%EF%BC%89%20Java%E4%B8%ADsynchronized%20%E5%92%8C%20ReentrantLock%20%E6%9C%89%E4%BB%80%E4%B9%88%E4%B8%8D%E5%90%8C%EF%BC%9F" rel="nofollow" target="_self">32) Java中synchronized 和 ReentrantLock 有什么不同? <p id="33%EF%BC%89%20%E6%9C%89%E4%B8%89%E4%B8%AA%E7%BA%BF%E7%A8%8BT1%EF%BC%8CT2%EF%BC%8CT3%EF%BC%8C%E6%80%8E%E4%B9%88%E7%A1%AE%E4%BF%9D%E5%AE%83%E4%BB%AC%E6%8C%89%E9%A1%BA%E5%BA%8F%E6%89%A7%E8%A1%8C%EF%BC%9F-toc" style="margin-left:40px;"><a href="#33%EF%BC%89%20%E6%9C%89%E4%B8%89%E4%B8%AA%E7%BA%BF%E7%A8%8BT1%EF%BC%8CT2%EF%BC%8CT3%EF%BC%8C%E6%80%8E%E4%B9%88%E7%A1%AE%E4%BF%9D%E5%AE%83%E4%BB%AC%E6%8C%89%E9%A1%BA%E5%BA%8F%E6%89%A7%E8%A1%8C%EF%BC%9F" rel="nofollow" target="_self">33) 有三个线程T1,T2,T3,怎么确保它们按顺序执行? <p id="34)%20Thread%E7%B1%BB%E4%B8%AD%E7%9A%84yield%E6%96%B9%E6%B3%95%E6%9C%89%E4%BB%80%E4%B9%88%E4%BD%9C%E7%94%A8%EF%BC%9F-toc" style="margin-left:40px;"><a href="#34)%20Thread%E7%B1%BB%E4%B8%AD%E7%9A%84yield%E6%96%B9%E6%B3%95%E6%9C%89%E4%BB%80%E4%B9%88%E4%BD%9C%E7%94%A8%EF%BC%9F" rel="nofollow" target="_self">34) Thread类中的yield方法有什么作用? <p id="35%EF%BC%89%20Java%E4%B8%ADConcurrentHashMap%E7%9A%84%E5%B9%B6%E5%8F%91%E5%BA%A6%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F-toc" style="margin-left:40px;"><a href="#35%EF%BC%89%20Java%E4%B8%ADConcurrentHashMap%E7%9A%84%E5%B9%B6%E5%8F%91%E5%BA%A6%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F" rel="nofollow" target="_self">35) Java中ConcurrentHashMap的并发度是什么? <p id="36%EF%BC%89%20Java%E4%B8%ADSemaphore%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F-toc" style="margin-left:40px;"><a href="#36%EF%BC%89%20Java%E4%B8%ADSemaphore%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F" rel="nofollow" target="_self">36) Java中Semaphore是什么? <p id="37%EF%BC%89%E5%A6%82%E6%9E%9C%E4%BD%A0%E6%8F%90%E4%BA%A4%E4%BB%BB%E5%8A%A1%E6%97%B6%EF%BC%8C%E7%BA%BF%E7%A8%8B%E6%B1%A0%E9%98%9F%E5%88%97%E5%B7%B2%E6%BB%A1%E3%80%82%E4%BC%9A%E6%97%B6%E5%8F%91%E4%BC%9A%E7%94%9F%E4%BB%80%E4%B9%88%EF%BC%9F-toc" style="margin-left:40px;"><a href="#37%EF%BC%89%E5%A6%82%E6%9E%9C%E4%BD%A0%E6%8F%90%E4%BA%A4%E4%BB%BB%E5%8A%A1%E6%97%B6%EF%BC%8C%E7%BA%BF%E7%A8%8B%E6%B1%A0%E9%98%9F%E5%88%97%E5%B7%B2%E6%BB%A1%E3%80%82%E4%BC%9A%E6%97%B6%E5%8F%91%E4%BC%9A%E7%94%9F%E4%BB%80%E4%B9%88%EF%BC%9F" rel="nofollow" target="_self">37)如果你提交任务时,线程池队列已满。会时发会生什么? <p id="38)%20Java%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%ADsubmit()%20%E5%92%8C%20execute()%E6%96%B9%E6%B3%95%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F-toc" style="margin-left:40px;"><a href="#38)%20Java%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%ADsubmit()%20%E5%92%8C%20execute()%E6%96%B9%E6%B3%95%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F" rel="nofollow" target="_self">38) Java线程池中submit() 和 execute()方法有什么区别? <p id="39)%20%E4%BB%80%E4%B9%88%E6%98%AF%E9%98%BB%E5%A1%9E%E5%BC%8F%E6%96%B9%E6%B3%95%EF%BC%9F-toc" style="margin-left:40px;"><a href="#39)%20%E4%BB%80%E4%B9%88%E6%98%AF%E9%98%BB%E5%A1%9E%E5%BC%8F%E6%96%B9%E6%B3%95%EF%BC%9F" rel="nofollow" target="_self">39) 什么是阻塞式方法? <p id="40)%20Swing%E6%98%AF%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%E5%90%97%EF%BC%9F%20%E4%B8%BA%E4%BB%80%E4%B9%88%EF%BC%9F-toc" style="margin-left:40px;"><a href="#40)%20Swing%E6%98%AF%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%E5%90%97%EF%BC%9F%20%E4%B8%BA%E4%BB%80%E4%B9%88%EF%BC%9F" rel="nofollow" target="_self">40) Swing是线程安全的吗? 为什么? <p id="41%EF%BC%89%20Java%E4%B8%ADinvokeAndWait%20%E5%92%8C%20invokeLater%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F-toc" style="margin-left:40px;"><a href="#41%EF%BC%89%20Java%E4%B8%ADinvokeAndWait%20%E5%92%8C%20invokeLater%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F" rel="nofollow" target="_self">41) Java中invokeAndWait 和 invokeLater有什么区别? <p id="42)%20Swing%20API%E4%B8%AD%E9%82%A3%E4%BA%9B%E6%96%B9%E6%B3%95%E6%98%AF%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%EF%BC%9F-toc" style="margin-left:40px;"><a href="#42)%20Swing%20API%E4%B8%AD%E9%82%A3%E4%BA%9B%E6%96%B9%E6%B3%95%E6%98%AF%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%EF%BC%9F" rel="nofollow" target="_self">42) Swing API中那些方法是线程安全的? <p id="43)%20%E5%A6%82%E4%BD%95%E5%9C%A8Java%E4%B8%AD%E5%88%9B%E5%BB%BAImmutable%E5%AF%B9%E8%B1%A1%EF%BC%9F-toc" style="margin-left:40px;"><a href="#43)%20%E5%A6%82%E4%BD%95%E5%9C%A8Java%E4%B8%AD%E5%88%9B%E5%BB%BAImmutable%E5%AF%B9%E8%B1%A1%EF%BC%9F" rel="nofollow" target="_self">43) 如何在Java中创建Immutable对象? <p id="44%EF%BC%89%20Java%E4%B8%AD%E7%9A%84ReadWriteLock%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F-toc" style="margin-left:40px;"><a href="#44%EF%BC%89%20Java%E4%B8%AD%E7%9A%84ReadWriteLock%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F" rel="nofollow" target="_self">44) Java中的ReadWriteLock是什么? <p id="45)%20%E5%A4%9A%E7%BA%BF%E7%A8%8B%E4%B8%AD%E7%9A%84%E5%BF%99%E5%BE%AA%E7%8E%AF%E6%98%AF%E4%BB%80%E4%B9%88%3F-toc" style="margin-left:40px;"><a href="#45)%20%E5%A4%9A%E7%BA%BF%E7%A8%8B%E4%B8%AD%E7%9A%84%E5%BF%99%E5%BE%AA%E7%8E%AF%E6%98%AF%E4%BB%80%E4%B9%88%3F" rel="nofollow" target="_self">45) 多线程中的忙循环是什么? <p id="46%EF%BC%89volatile%20%E5%8F%98%E9%87%8F%E5%92%8C%20atomic%20%E5%8F%98%E9%87%8F%E6%9C%89%E4%BB%80%E4%B9%88%E4%B8%8D%E5%90%8C%EF%BC%9F-toc" style="margin-left:40px;"><a href="#46%EF%BC%89volatile%20%E5%8F%98%E9%87%8F%E5%92%8C%20atomic%20%E5%8F%98%E9%87%8F%E6%9C%89%E4%BB%80%E4%B9%88%E4%B8%8D%E5%90%8C%EF%BC%9F" rel="nofollow" target="_self">46)volatile 变量和 atomic 变量有什么不同? <p id="47)%20%E5%A6%82%E6%9E%9C%E5%90%8C%E6%AD%A5%E5%9D%97%E5%86%85%E7%9A%84%E7%BA%BF%E7%A8%8B%E6%8A%9B%E5%87%BA%E5%BC%82%E5%B8%B8%E4%BC%9A%E5%8F%91%E7%94%9F%E4%BB%80%E4%B9%88%EF%BC%9F-toc" style="margin-left:40px;"><a href="#47)%20%E5%A6%82%E6%9E%9C%E5%90%8C%E6%AD%A5%E5%9D%97%E5%86%85%E7%9A%84%E7%BA%BF%E7%A8%8B%E6%8A%9B%E5%87%BA%E5%BC%82%E5%B8%B8%E4%BC%9A%E5%8F%91%E7%94%9F%E4%BB%80%E4%B9%88%EF%BC%9F" rel="nofollow" target="_self">47) 如果同步块内的线程抛出异常会发生什么? <p id="48%EF%BC%89%20%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F%E7%9A%84%E5%8F%8C%E6%A3%80%E9%94%81%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F-toc" style="margin-left:40px;"><a href="#48%EF%BC%89%20%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F%E7%9A%84%E5%8F%8C%E6%A3%80%E9%94%81%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F" rel="nofollow" target="_self">48) 单例模式的双检锁是什么? <p id="49%EF%BC%89%20%E5%A6%82%E4%BD%95%E5%9C%A8Java%E4%B8%AD%E5%88%9B%E5%BB%BA%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84Singleton%EF%BC%9F-toc" style="margin-left:40px;"><a href="#49%EF%BC%89%20%E5%A6%82%E4%BD%95%E5%9C%A8Java%E4%B8%AD%E5%88%9B%E5%BB%BA%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84Singleton%EF%BC%9F" rel="nofollow" target="_self">49) 如何在Java中创建线程安全的Singleton? <p id="51)%20%E5%A6%82%E4%BD%95%E5%BC%BA%E5%88%B6%E5%90%AF%E5%8A%A8%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%EF%BC%9F-toc" style="margin-left:40px;"><a href="#51)%20%E5%A6%82%E4%BD%95%E5%BC%BA%E5%88%B6%E5%90%AF%E5%8A%A8%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%EF%BC%9F" rel="nofollow" target="_self">51) 如何强制启动一个线程? <p id="52)%20Java%E4%B8%AD%E7%9A%84fork%20join%E6%A1%86%E6%9E%B6%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F-toc" style="margin-left:40px;"><a href="#52)%20Java%E4%B8%AD%E7%9A%84fork%20join%E6%A1%86%E6%9E%B6%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F" rel="nofollow" target="_self">52) Java中的fork join框架是什么? <p id="53%EF%BC%89%20Java%E5%A4%9A%E7%BA%BF%E7%A8%8B%E4%B8%AD%E8%B0%83%E7%94%A8wait()%20%E5%92%8C%20sleep()%E6%96%B9%E6%B3%95%E6%9C%89%E4%BB%80%E4%B9%88%E4%B8%8D%E5%90%8C%EF%BC%9F-toc" style="margin-left:40px;"><a href="#53%EF%BC%89%20Java%E5%A4%9A%E7%BA%BF%E7%A8%8B%E4%B8%AD%E8%B0%83%E7%94%A8wait()%20%E5%92%8C%20sleep()%E6%96%B9%E6%B3%95%E6%9C%89%E4%BB%80%E4%B9%88%E4%B8%8D%E5%90%8C%EF%BC%9F" rel="nofollow" target="_self">53) Java多线程中调用wait() 和 sleep()方法有什么不同? <hr id="hr-toc"> 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点。欲了解更多详细信息请。 <h2 id="2)%20%E7%BA%BF%E7%A8%8B%E5%92%8C%E8%BF%9B%E7%A8%8B%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F"> 线程是进程的子集,一个进程可以有很多线程。每个进程都有自己的内存空间,可执行代码和唯一进程标识符(PID)。? 每条线程并行执行不同的任务。不同的进程使用不同的内存空间(线程自己的堆栈),而所有的线程共享一片相同的内存空间(进程主内存)。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。更多详细信息请。 如下图所示: <h2 id="3)%20%E5%A6%82%E4%BD%95%E5%9C%A8Java%E4%B8%AD%E5%AE%9E%E7%8E%B0%E7%BA%BF%E7%A8%8B%EF%BC%9F"> 在语言层面有两种方式。java.lang.Thread 类的实例就是一个线程但是它需要调用java.lang.Runnable接口来执行,由于Thread类本身就是调用的Runnable接口。看Thead和Runnable的源码: <pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="language-java hljs"><ol class="hljs-ln"> { ...
{ ...
{...}
{...}
{...}
<h2 id="26%EF%BC%89%20%E5%A6%82%E4%BD%95%E5%86%99%E4%BB%A3%E7%A0%81%E6%9D%A5%E8%A7%A3%E5%86%B3%E7%94%9F%E4%BA%A7%E8%80%85%E6%B6%88%E8%B4%B9%E8%80%85%E9%97%AE%E9%A2%98%EF%BC%9F"> 在现实中你解决的许多线程问题都属于生产者消费者模型,就是一个线程生产任务供其它线程进行消费,你必须知道怎么进行线程间通信来解决这个问题。比较低级的办法是用wait和notify来解决这个问题,比较赞的办法是用Semaphore 或者 BlockingQueue来实现生产者消费者模型,有实现它。 <h2 id="27%EF%BC%89%20%E5%A6%82%E4%BD%95%E9%81%BF%E5%85%8D%E6%AD%BB%E9%94%81%EF%BC%9F"> Java多线程中的死锁 死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。这是一个严重的问题,因为死锁会让你的程序挂起无法完成任务,死锁的发生必须满足以下四个条件:
避免死锁最简单的方法就是阻止循环等待条件,将系统中所有的资源设置标志位、排序,规定所有的进程申请资源必须以一定的顺序(升序或降序)做操作来避免死锁。有代码示例和避免死锁的讨论细节。 <h2 id="28)%20Java%E4%B8%AD%E6%B4%BB%E9%94%81%E5%92%8C%E6%AD%BB%E9%94%81%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F"> 这是上题的扩展,活锁和死锁类似,不同之处在于处于活锁的线程或进程的状态是不断改变的,活锁可以认为是一种特殊的饥饿。一个现实的活锁例子是两个人在狭小的走廊碰到,两个人都试着避让对方好让彼此通过,但是因为避让的方向都一样导致最后谁都不能通过走廊。简单的说就是,活锁和死锁的主要区别是前者进程的状态可以改变但是却不能继续执行。
<h2 id="29%EF%BC%89%20%E6%80%8E%E4%B9%88%E6%A3%80%E6%B5%8B%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E6%98%AF%E5%90%A6%E6%8B%A5%E6%9C%89%E9%94%81%EF%BC%9F"> 我一直不知道我们竟然可以检测一个线程是否拥有锁,直到我参加了一次电话面试。在java.lang.Thread中有一个方法叫holdsLock(),它返回true如果当且仅当当前线程拥有某个具体对象的锁。你可以查看了解更多。 <h2 id="30)%20%E4%BD%A0%E5%A6%82%E4%BD%95%E5%9C%A8Java%E4%B8%AD%E8%8E%B7%E5%8F%96%E7%BA%BF%E7%A8%8B%E5%A0%86%E6%A0%88%EF%BC%9F"> 对于不同的操作系统,有多种方法来获得Java进程的线程堆栈。当你获取线程堆栈时,JVM会把所有线程的状态存到日志文件或者输出到控制台。在Windows你可以使用Ctrl + Break组合键来获取线程堆栈,Linux下用kill -3命令。你也可以用jstack这个工具来获取,它对线程id进行操作,你可以用jps这个工具找到id。 <h2 id="31)%20JVM%E4%B8%AD%E5%93%AA%E4%B8%AA%E5%8F%82%E6%95%B0%E6%98%AF%E7%94%A8%E6%9D%A5%E6%8E%A7%E5%88%B6%E7%BA%BF%E7%A8%8B%E7%9A%84%E6%A0%88%E5%A0%86%E6%A0%88%E5%B0%8F%E7%9A%84"> 这个问题很简单, -Xss参数用来控制线程的堆栈大小。你可以查看来了解这个参数的更多信息。 <h2 id="32%EF%BC%89%20Java%E4%B8%ADsynchronized%20%E5%92%8C%20ReentrantLock%20%E6%9C%89%E4%BB%80%E4%B9%88%E4%B8%8D%E5%90%8C%EF%BC%9F"> Java在过去很长一段时间只能通过synchronized关键字来实现互斥,它有一些缺点。比如你不能扩展锁之外的方法或者块边界,尝试获取锁时不能中途取消等。Java 5 通过Lock接口提供了更复杂的控制来解决这些问题。 ReentrantLock 类实现了 Lock,它拥有与 synchronized 相同的并发性和内存语义且它还具有可扩展性。你可以查看了解更多
<pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="language-java hljs"><ol class="hljs-ln"> ReenTrantLock();
{
{
{
Thread t1 = Thread( Runnable() {
{
);
Thread t2 = Thread( Runnable() {
{
{
(InterruptedException e) {
);
Thread( Runnable() {
{
{
(InterruptedException e) {
);
{
String Exception {
task) method.");
;
future = executorService.submit(callable);
{
(InterruptedException e) {
(ExecutionException e) {
{
;
;
Resource resource;
Resource {
(resource == ) {
(DoubleCheckedLocking.class) {
(resource == ) {
Resource();
resource;
Singleton uniqueInstance;
{
Singleton {
(uniqueInstance == ) {
(Singleton.class) {
(uniqueInstance == ) {
Singleton();
uniqueInstance;
{
Resource resource = Resource();
Resource {
ResourceHolder.resource;
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |