47) 如果同步块内的线程抛出异常会发生什么?
(3)线程2的run()方法中同步代码块先获取lock2的对象锁,接着获取lock1的对象锁,当然这时lock1的对象锁已经被线程1锁,线程2肯定是要等待线程1释放lock1的对象锁的。调用object.wait()时,线程先要获取这个对象的对象锁,当前线程必须在锁对象保持同步,把当前线程添加到等待队列中,随后另一线程可以同步同一个对象锁来调用object.notify(),这样将唤醒原来等待中的线程,然后释放该锁。在执行同步代码块的过程中,执行了锁所属对象的wait()方法,这个线程会释放对象锁,而此线程对象会进入线程等待池中,等待被唤醒。
48) 单例模式的双检锁是什么?
这个问题在Java面试中经常被问到,但是面试官对回答此问题的满意度仅为50%。一半的人写不出双检锁还有一半的人说不出它的隐患和Java1.5是如何对它修正的。它其实是一个用来创建线程安全的单例的老方法,当单例实例第一次被创建时它试图用单个锁进行性能优化,但是由于太过于复杂在JDK1.4中它是失败的,我个人也不喜欢它。无论如何,即便你也不喜欢它但是还是要了解一下,因为它经常被问到。你可以查看how double checked locking on Singleton works这篇文章获得更多信息。
49) 如何在Java中创建线程安全的Singleton?
这是上面那个问题的后续,如果你不喜欢双检锁而面试官问了创建Singleton类的替代方法,你可以利用JVM的类加载和静态变量初始化特征来创建Singleton实例,或者是利用枚举类型来创建Singleton,我很喜欢用这种方法。你可以查看这篇文章获得更多信息。

50) 写出3条你遵循的多线程最佳实践
这种问题我最喜欢了,我相信你在写并发代码来提升性能的时候也会遵循某些最佳实践。以下三条最佳实践我觉得大多数Java程序员都应该遵循:
给你的线程起个有意义的名字。
orderprocessor, quoteprocessor or tradeprocessor 这种名字比 thread-1. thread-2 and thread-3 好多了,给线程起一个和它要完成的任务相关的名字,所有的主要框架甚至jdk都遵循这个最佳实践。我们的好多学生讲起话来头头是道,滔滔不绝,但“写”起文章来就不怎么样了.因为“说话”在生活中再普遍不过了,有充分的实践机会,而“写”的实践的机会就很少了.因此,我们的作文教学应遵循从说到写的原则.。3.利用喊话极度追踪解决下断找call返回相同数据(线程发包)。
避免锁定和缩小同步的范围
锁花费的代价高昂且上下文切换更耗费时间空间,试试最低限度的使用同步和锁,缩小临界区。因此相对于同步方法我更喜欢同步块,它给我拥有对锁的绝对控制权。
多用同步类少用wait 和 notify
首先,CountDownLatch, Semaphore, CyclicBarrier 和 Exchanger 这些同步类简化了编码操作,而用wait和notify很难实现对复杂控制流的控制。其次,这些类是由最好的企业编写和维护在后续的JDK中它们还会不断优化和完善,使用这些更高等级的同步工具你的程序可以不费吹灰之力获得优化。
多用并发集合少用同步集合
这是另外一个容易遵循且受益巨大的最佳实践,并发集合比同步集合的可扩展性更好,所以在并发编程时使用并发集合效果更好。如果下一次你需要用到map,你应该首先想到用ConcurrentHashMap。我的文章Java并发集合有更详细的说明。
51) 如何强制启动一个线程?
这个问题就像是如何强制进行Java垃圾回收,目前还没有觉得方法,虽然你可以使用System.gc()来进行垃圾回收,但是不保证能成功。在Java里面没有办法强制启动一个线程,它是被线程调度器控制着且Java没有公布相关的API。
52) Java中的fork join框架是什么?
fork join框架是JDK7中出现的一款高效的工具,Java开发人员可以通过它充分利用现代服务器上的多处理器。它是专门为了那些可以递归划分成许多子模块设计的,目的是将所有可用的处理能力用来提升程序的性能。fork join框架一个巨大的优势是它使用了工作窃取算法,可以完成更多任务的工作线程可以从其它线程中窃取任务来执行。你可以查看这篇文章获得更多信息。
53) Java多线程中调用wait() 和 sleep()方法有什么不同?
wait ()方法用于线程间通信,如果等待条件为真且其它线程被唤醒时它会释放锁,而 sleep ()方法仅仅释放 cpu 资源或者让当前线程停止执行一段时间,但不会释放锁。调用object.wait()时,线程先要获取这个对象的对象锁,当前线程必须在锁对象保持同步,把当前线程添加到等待队列中,随后另一线程可以同步同一个对象锁来调用object.notify(),这样将唤醒原来等待中的线程,然后释放该锁。其中wait表示让正在进行的线程暂停执行,释放对象锁,进入等待阻塞状态,直到被其他的线程唤醒或者是等待阻塞超时才重新进入就绪状态等待获取锁,。
1、进入考场前:提前到达考场,核对信息,进入候考室,等待抽题,抽题的顺序是根据面试所安排的序号所进行的,考生所抽的题目是待会面试进行试讲的题目,幼儿园学段面试有两道题,考生从中抽选一题作为待会试讲的题目,两道题一般是涉及两种不同的类型(弹唱、绘画、手工制作、体育活动、科学活动等),我当时所抽的题一题是弹唱类、一题是绘画类,我个人觉得弹唱类比较难,所以就选择了绘画类,但是有时也有人抽的两道都是弹唱类的,所以小伙伴们在平常准备的时候每一类型都要多加准备,这样在面试的时候才不会手足无措。本书主要内容包括:面试流程及准备、英语面试、电话面试、c/c++语言基础、流程控制、输入/输出、预处理、内存管理、指针、面向对象基础、类、多态、继承、函数、模板与stl、数据结构、软件工程、、操作系统、计算机网络、经典算法题、操作题、思维拓展、文字解答实战题、程序改错实战题、编写程序实战题、智力测试、逻辑测试等。通常会在电话面试中经常被问到的java线程面试问题。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-115861-2.html
历史重要时刻往往都是靠热血推动