Java线程考试题Top50(转载)版权声明
原创原始链接: http://www.importnew.com/12773.html 本文由 ImportNew - 李 广 翻译自 javarevisited 。欢迎加入 Java小组 。转载见文章末尾的要求。
无论你是新手还是老手,在面试过程中都一定遇到过线程问题。Java该语言的一个重要特性是对并发性的内置支持,这允许Java深受企业和程序员的欢迎。大多数高薪人士Java开发岗位要求开发人员精通多线程技术,并拥有丰富的Java有程序开发、调试和优化的经验,所以在面试中经常提到与线程相关的问题。
在典型的Java面试中, 面试官会问到线程的基本概念。, 例如,为什么需要使用线程, 如何创建线程和如何创建线程更好(例如: 继承thread类或调用Runnable接口 ),然后逐渐地同时提出问题,如Java在并发编程的过程中遇到了哪些挑战,Java内存模型,JDK1.5引入了哪些高阶并发工具,并经常使用并发编程。 设计模式 经典的多线程问题,如生产者消费者、哲学家就餐、读者-作家或简单的有界缓冲区问题。仅仅了解线程的基本概念是不够的, 你必须知道怎么处理 死锁 , 竞态条件 、内存冲突和线程安全等并发性问题。有了这些技能,你可以轻松地处理多线程和同时进行的面试。
许多Java程序员在面试前去看面试问题是很正常的。因为收集面试问题和练习需要时间,所以我从许多受访者那里收集了这些问题。Java与多线程和并发相关50一个热点问题。我只收集了相对较新的面试问题,并没有提供所有的答案。我想聪明的你已经很清楚这些问题了, 如果你遇到了你不理解的问题,您可以使用它们。Google找到答案。如果你真的找不到答案,可以在文章的评论中向我寻求帮助。你也可以在这里找到一些答案。 Java线程问答Top 12 。
50道Java将面试问题串起来
下面是Java与主题相关的热门面试问题,你可以用它来为面试做准备。
1) 什么是线?
线程是操作系统可以执行计算调度的最小单位,它包含在进程中,是进程的实际操作单位。它允许程序员对多处理器进行编程,您可以使用多线程来加速计算密集型任务。例如,如果线程完成了一项任务100在毫秒内,只需要10个线程就可以完成更换任务10毫秒。Java它在语言级别为多线程提供了极好的支持,也是一个很好的卖点。欲了解更多详情,请 点击这里 。
2) 线程和进程之间的区别是什么?
线程是进程的子集。一个进程可以有多个线程,每个线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有线程共享相同的内存空间。不要将其与堆栈内存混淆,每个线程都有单独的堆栈内存来存储本地数据。请给我更多细节。 点击这里 。
3) 如何在Java在中实现线程?
在语言层面上有两种方法。java.lang.Thread 类的实例是一个线程,但它需要被调用。java.lang.Runnable接口执行,因为调用的是线程类本身。Runnable接口,这样您就可以继承java.lang.Thread 类或直接调用。Runnable要重写的接口run()方法实现该线程。请给我更多细节。 点击这里 .
4) 用Runnable还是Thread?
这个问题是上述问题的后续问题。每个人都知道我们可以继承它。Thread类或调用Runnable接口来实现线程,问题是,哪种方法更好?是什么时候用的?如果你知道,这个问题很容易回答Java不支持类的多重继承,但允许调用多个接口。因此,如果您想继承其他类,当然,调用。Runnable界面已准备好。请给我更多细节。 点击这里 。
6) Thread 类中的start() 和 run() 这两种方法有什么关系呢?
这个问题是经常被问到的,但它仍然可以区分面试官的意见。Java对线程模型的理解程度。start()方法用于启动新创建的线程,并且start()内部呼叫run()方法,该方法被直接调用。run()这种方法的效果是不同的。当你打电话的时候run()方法,将仅在原始线程中调用,不启动新线程,start()方法来启动新线程。如需更多讨论,请 点击这里
7) Java中Runnable和Callable有什么关系呢?
Runnable和Callable两者都表示要在不同的线程中执行的任务。Runnable从JDK1.0一开始,Callable是在JDK1.5增加了。他们的主要区别是Callable的 call() 方法可以返回值并引发异常,而Runnable的run()方法不具有这些功能。Callable您可以返回具有计算结果的加载。Future对象。 我的博客 更详细地解释了。
8) Java中CyclicBarrier 和 CountDownLatch有什么关系呢?
CyclicBarrier 和 CountDownLatch 可用于让一组线程等待其他线程。使用 CyclicBarrier 不同的是,CountdownLatch 不能重复使用。 单击此处查看更多信息和示例代码。 。
9) Java内存模型是什么?
Java内存模型法规和指南Java不同存储器体系结构中的程序,CPU以及具有确定性行为的操作系统。这在多线程的情况下尤其重要。Java内存模型对一个线程所做的更改可以被其他线程看到,以提供它们首先相关的保证。这种关系定义了一些规则,使程序员在并发编程时能够更清晰地思考。例如,第一个关系确保:
- 线程中的代码可以按顺序执行,这称为程序顺序规则。
- 对于同一锁,解锁操作必须在该时间之后发生的另一锁定操作之前进行,也称为管锁规则。
- 前一个对
volatile
后者中的写入操作volatile
在读操作之前,它也被调用。volatile
可变规则。 - 线程中的任何操作都必须在此线程中。start()在调用之后,它也称为线程启动规则。
- 线程的所有操作在线程终止之前终止线程规则。
- 在对象被构造之后,对象的终止必须称为对象终止规则。
- 可传递性
我强烈建议你阅读“Java并行编程实践第16章加深对Java对内存模型的理解。
10) Java中的volatile 变量是什么?
volatile是只有成员变量才能使用的特殊修饰符。在……里面Java在没有并发程序的同步类的情况下,对成员变量的多线程操作对其他线程是透明的。volatile该变量确保下一次读操作将发生在上一次写操作之后,这是前面的问题。volatile可变规则。 点击这里 查看更多volatile相关内容。
11) 什么是线程安全?Vector它是线程安全的类吗? ( 详见这里 )
如果您的代码处于同时运行多个线程的进程中,则这些线程可能会同时运行代码。如果每次运行的结果与单个线程的结果相同,并且其他变量的值与预期的值相同,则它是线程安全的。如果线程安全计数器类的同一实例对象被多个线程使用,则该实例对象不会计算失败。显然,您可以将集合类分为两组,线程安全组和非线程安全组。Vector 是使用同步方法实现线程安全, 与之相似的是ArrayList不是线程安全的。
12) Java比赛条件是什么? 最后给出了一个算例。
在并发情况下,争用条件会导致程序有一些。bugs。多线程对某些资源的竞争会产生竞争条件,如果第一个要执行的程序后来不能执行,那么整个程序就会出现一些不确定性。bugs。这种bugs由于线程之间的随机竞争,很难找到并重复。无序处理就是一个例子,详见 答案 。
13) Java我怎么才能让一根线停下来呢?
Java提供了非常丰富的API但是,它不是为停止线程提供的。API。JDK 1.0有一些事情,比如stop(), suspend() 和 resume()然而,由于存在潜在的僵局威胁,后续的控制方法JDK他们在版本中被抛弃了,然后Java API的设计器不提供兼容且线程安全的方法来停止线程。什么时候run() 或者 call() 当执行该方法时,该线程将自动结束。,如果要手动结束线程,可以使用它。volatile 要退出的布尔变量run()方法循环或取消任务以中断线程。 点击这里 查看示例代码。
14) 如果线程运行时发生异常,会发生什么情况?
这是我在一次采访中遇到的。 很刁钻的Java面试题 , 简单地说,如果没有捕捉到异常,线程将停止执行。Thread.UncaughtExceptionHandler是一个嵌入式接口,用于处理由未捕获的异常引起的线程突然中断。当未捕获的异常将导致线程中断时。JVM会使用Thread.getUncaughtExceptionHandler()查询线程的UncaughtExceptionHandler并将线程和异常作为参数传递给handler的uncaughtException()处理方法。
15) 如何在两个线程之间共享数据?
您可以通过共享对象或使用并发数据结构(如阻塞队列)来完成此操作。本教程 《Java线程间通信 (涉及在两个线程之间共享对象)用wait和notify方法实现生产者-消费者模型。
16) Java中notify 和 notifyAll有什么关系呢?
这是另一个棘手的问题,因为多线程可以等待单个监视锁,Java API 设计器提供了在等待条件更改时通知他们的方法,但这些方法并未完全实现。notify()该方法不能唤醒特定线程,因此它仅在线程等待时有用。和notifyAll()唤醒所有线程并允许它们竞争锁确保至少有一个线程可以继续运行。 我的博客 还有更详细的信息和示例代码。
17) 为什么wait, notify 和 notifyAll这些方法不是thread类里面?
这是一个与设计相关的问题,它考察了面试官对现有系统的看法,以及一些常见但似乎不合理的事情。在回答这些问题时,你应该解释为什么要采用这些方法。Object类是有意义的,并且不会将其放入Thread在课堂上的原因。一个显而易见的原因是JAVA提供的锁是对象级的,而不是线程级的,每个对象都有一个通过线程获得的锁。如果线程需要等待某些锁,则调用该对象。wait()这种方法是有意义的。如果wait()方法在中定义Thread在类中,线程正在等待哪个锁并不明显。简单地说,因为wait,notify和notifyAll是锁级操作,因此在Object类的新实例,因为锁属于该对象。您还可以查看 这篇文章 了解更多信息。
18) 什么是ThreadLocal变量?
ThreadLocal是Java中的特殊变量。每个线程都有一个ThreadLocal就是每条线都有自己的自变量,完全消除了竞争条件。对于创建代价高昂的对象(如您可以使用的对象)而言,这是获得线程安全性的好方法。ThreadLocal让SimpleDateFormat它变得线程安全,因为该类的创建成本很高,并且需要为每次调用创建不同的实例,因此不值得在本地使用它。如果每个线程都有自己唯一的变量副本,将大大提高效率。首先,通过重用减少了创建的昂贵对象的数量。其次,无需使用代价高昂的同步或不变性,即可获得线程安全。线程局部变量的另一个很好的例子是ThreadLocalRandom类,这减少了代价高昂的Random对象的数量。观 答案 了解更多信息。
19) 什么是FutureTask?
在Java在并发程序中FutureTask表示可以取消的异步操作。它有开始和取消操作、查询操作是否完成、检索结果等方法。如果操作尚未完成,则只能在操作完成时检索结果get方法将被阻止。一个FutureTask可以调用该对象。Callable和Runnable该对象被包装是因为。FutureTask它也被称为Runnable接口,以便可以将其提交到Executor来执行。
20) Java中interrupted 和 isInterruptedd这两种方法有何不同?
interrupted() 和 isInterrupted() 主要区别在于前者将清除中断状态,而后者不会。Java多线程中断机制是通过内部标识调用实现的。 Thread.interrupt() 要中断线程,请设置中断标识。true。当中断线程调用 静态方法 Thread.interrupted() 当检查中断状态时,中断状态被清除。而不是静态方法isInterrupted()用于查询其他线程的中断状态,而不更改中断状态标识。简单地说,任何投掷InterruptedException异常方法将清除中断状态。在任何情况下,一个线程的中断状态都可能被调用中断的其他线程改变。
21) 为什么wait和notify方法在同步块中调用?
主要是因为Java API如果你不这样做,你的代码就会抛出。IllegalMonitorStateException例外。另一个原因是避免wait和notify在比赛条件之间。
22) 为什么要检查循环中的等待条件。?
处于等待状态的线程可能会收到错误警报和伪唤醒,如果循环中没有检查到等待条件,程序将在不满足结束条件的情况下退出。因此,当等待线程唤醒时,不能认为其原始等待状态仍然有效。notify()它可能会在调用方法之后、线程唤醒之前更改。这在循环中使用。wait()这种方法效果更好的原因是,你可以。 Eclipse 在中创建模板调用wait和notify试试看。如果你想了解更多关于这个问题的信息,我建议你阅读“ Effective Java 本书中的线程和同步章节。
23) Java中的同步集合与并发集合有什么关系呢?
同步集合和并发集合都为多线程和并发提供了合适的线程安全集合,但并发集合的可伸缩性更强。在……里面Java1.5以前,程序员只使用同步集合,在多线程并发时会引起争用,阻碍了系统的可伸缩性。Java5介绍了并发采集图像。ConcurrentHashMap,不仅提供了线程安全,还利用锁分离和内部分区等现代技术提高了可伸缩性。更多详情,请参阅 答案 。
24) Java中堆和栈有什么关系呢?
为什么这个问题被分为多线程和并行面试问题?因为堆栈是与线程密切相关的内存区。每个线程都有自己的堆栈内存,用于存储局部变量、方法参数和堆栈调用,存储在一个线程中的变量对其他线程不可见。堆是所有线程共享的公共内存区。对象在堆中创建。为了提高效率,线程将从堆到自己的堆栈进行缓存。如果多个线程使用此变量,可能会导致问题。在这个时候volatile 变量可以工作,这需要线程从主内存中读取变量的值。 更多详情,请参阅 答案 。
25) 什么是线程池? 为什么要用它?
创建线程需要昂贵的资源和时间。如果任务来了,响应时间会更长,一个进程可以创建有限数量的线程。为了避免这些问题,创建了几个线程来响应程序启动时的处理。它们被称为线程池,而其中的线程被称为工作线程。从…JDK1.5开始,Java API提供了Executor框架让你可以创建不同的线程池。比如单线程池,每次处理一个任务;数目固定的线程池或者是缓存线程池(一个适合很多生存期短的任务的程序的可扩展线程池)。更多详情,请参阅 这篇文章 。
26) 我如何编写代码来解决生产者和消费者之间的问题?
在现实中,你解决的很多线程问题都属于生产者-消费者模式,即一个线程生产任务让其他线程消费,你必须知道如何在线程之间进行通信来解决这个问题。较低级别的方法是使用wait和notify要解决这个问题,更好的方法是使用Semaphore 或者 BlockingQueue为了实施生产者-消费者模式, 这篇教程 它是有实施的。
27) 如何避免死锁?
Java多线程中的死锁 死锁是一种现象,在这种现象中,两个或多个进程在执行期间竞争资源时相互等待,如果没有外力,它们将无法前进。这是一个严重的问题,因为死锁会使程序挂起,无法完成任务。死锁的发生必须满足以下四个条件:
- 互斥条件:一个资源一次只能被一个进程使用。
- 请求和保持条件:当进程被请求资源阻塞时,它对获取的资源保持开放。
- 非剥夺条件:该过程已经获得的资源在最终用完之前不能被强行剥夺。
- 循环等待条件:多个进程之间形成循环等待资源关系。
避免死锁的最简单方法是防止循环等待条件,设置标志位并对系统中的所有资源进行排序,并规定所有进程应用程序资源必须按一定的顺序(升序或降序)操作以避免死锁。 这篇教程 这里有避免死锁的代码示例和讨论细节。
28) Java中活锁和死锁有什么关系呢?
这是上述问题的延伸。活锁类似于死锁,不同之处在于活锁中的线程或进程的状态不断变化。活锁可以被认为是一种特殊的饥饿。活锁的一个实际例子是两个人在一条狭窄的走廊里相遇。他们两个都试图避开对方,这样他们就可以通过对方。但由于避让方向相同,最终没有人能通过走廊。简单地说,活动锁和死锁之间的主要区别在于,前者的进程可以更改其状态,但不能继续执行。
29) 如何检测线程是否有锁?
直到我参加了一次电话采访,我才知道我们甚至可以检测到一个线程是否有锁。在……里面java.lang.Thread有一种方法叫做holdsLock(),它返回true当且仅当当前线程对特定对象具有锁时。您可以查看 这篇文章 了解更多信息。
30) 你如何在Java把线程堆栈放进去?
对于不同的操作系统,有几种方法可以获得Java进程的线程堆栈。当你得到线程堆栈时,JVM所有线程的状态都保存到日志文件或输出到控制台。在……里面Windows您可以使用Ctrl + Break组合键以获得线程堆栈,Linux下用kill -3指挥部。您还可以使用jstack这个工具要拿到,它就快到线上了。id对于操作,您可以使用jps此工具可找到id。
31) JVM哪个参数用于控制线程的小堆栈。
问题很简单, -Xss该参数用于控制线程的堆栈大小。您可以查看 JVM配置列表 以了解有关此参数的更多信息。
32) Java中synchronized 和 ReentrantLock 有什么关系呢?
Java在过去很长一段时间里只能过去。synchronized关键字要实现互斥,有一定的弊端。例如,您不能将方法或块边界扩展到锁之外,也不能在尝试获取锁时中途取消它。Java 5 通过Lock接口提供了更复杂的控件来解决这些问题。 ReentrantLock 类实现了 Lock,它有一种关系 synchronized 相同的并发性和内存语义,并且它也是可伸缩的。您可以查看 这篇文章 了解更多
33) 有三条主线T1,T2,T3,如何确保它们按顺序执行?
在多线程处理中,有几种方法可以让线程以特定的顺序执行,您可以使用Three类。join()方法在一个线程中启动另一个线程,另一个线程完成该线程以继续执行。为了确保三个线程的顺序,您应该先启动最后一个线程。(T3调用T2,T2调用T1),这样T1它将首先完成。T3最后一次。您可以查看 这篇文章 了解更多信息。
34) Thread类中的yield这种方法的效果是什么?
Yield方法可以暂停当前正在执行的线程对象,并让具有相同优先级的其他线程执行。它是一个静态方法,只保证当前线程放弃。CPU不能保证占用率使其他线程能够占用CPU,执行yield()该线程可以在进入暂停状态后立即执行。 点击这里 查看更多yield方法相关内容。
35) Java中ConcurrentHashMap并发的程度是多少?
ConcurrentHashMap把实际map它被分成几个部分,以实现其可扩展性和线程安全性。这个除法是使用并发性获得的,这是ConcurrentHashMap类构造函数的可选参数,具有默认值16,因此在多线程情况下可以避免争用。要了解更多并发性和内部规模,请阅读我的文章 How ConcurrentHashMap works in Java 。
36) Java中Semaphore是什么?
Java中的Semaphore是一个新的同步类,它是计数信号。从概念上讲,信号量维护一个许可证集。如有必要,在许可证可用之前,每一项都将被阻止。 acquire()然后再拿到许可证。每个 release()添加许可证,这可能会释放被阻止的收购者。但是,不使用实际的许可证对象,Semaphore只计算可用许可证的数量并采取相应的行动。信号量通常在多线程代码中使用,例如数据库连接池。请给我更多细节。 点击这里 。
37如果提交任务,则线程池队列已满。会议期间会发生什么事?
这个问题非常巧妙,许多程序员会认为任务会阻塞,直到线程池队列为空。事实上,如果不能调度任务执行,那么ThreadPoolExecutor’s submit()方法将引发RejectedExecutionException异常。
38) Java线程池中submit() 和 execute()这两种方法有什么关系呢?
这两种方法都可以将任务提交到线程池,execute()该方法的返回类型为void,在中定义Executor接口中, 而submit()该方法可以返回保留计算的结果。Future对象,在中定义ExecutorService接口,它扩展了Executor接口,其他线程池类,如ThreadPoolExecutor和ScheduledThreadPoolExecutor有以下几种方法。请给我更多细节。 点击这里 。
39) 什么是阻止方法?
阻塞方法意味着程序将等待方法完成而不做其他任何事情,ServerSocket的accept()方法是等待客户端连接。这里的阻塞意味着当前线程将被挂起,直到返回结果。此外,还有在任务完成之前返回的异步和非阻塞方法。请给我更多细节。 点击这里 。
40) Swing它是线程安全的吗? 为什么?
你可以给出一个明确的答案,Swing它不是线程安全的,但你应该解释为什么你回答了这个问题,即使面试官没有问你为什么。当我们说swing它不是线程安全的,并且经常引用它的组件,这些组件不能在多个线程中修改。GUI组件的更新应该在AWT在线程中完成,而Swing提供同步和异步回调方法进行更新。 点击这里 查看更多swing和线程安全相关内容。
41) Java中invokeAndWait 和 invokeLater有什么关系呢?
这两种方法是Swing API 提供给Java开发人员使用从当前线程而不是事件分发线程更新GUI对于组件。InvokeAndWait()同步更新GUI组件,如进度条,更新进度后,进度条应相应更改。如果进度由多个线程跟踪,则调用invokeAndWait()方法请求事件调度线程相应地更新组件。和invokeLater()该方法异步调用更新组件。请给我更多细节。 点击这里 。
42) Swing API哪些方法是线程安全的?
这个问题再次被提及。swing和线程安全,虽然组件不是线程安全的,但有一些方法可以由多个线程安全地调用,例如repaint(), revalidate()。 JTextComponent的setText()方法和JTextArea的insert() 和 append() 方法也是线程安全的。
43) 如何在Java中创建Immutable对象?
这个问题似乎与多线程无关, 但不变性有助于简化本已复杂的并发程序。Immutable无需同步即可共享对象,从而减少了并发访问对象的同步开销。但Java没有@Immutable为了创建一个不可变的类,这个注释实现了以下步骤:通过构造方法初始化所有成员,并且不提供变量。setter方法,则声明所有成员为私有成员,因此不允许直接访问这些成员。getter在该方法中,不直接返回对象本身,而是克隆对象并返回对象的副本。我的文章 how to make an object Immutable in Java 还有详细的教程,看完后你可以信心满满。
44) Java中的ReadWriteLock是什么?
通常,读写锁是用于提高并发程序性能的锁分离技术的结果。Java中的ReadWriteLock是Java 5 一个新的界面,一个。ReadWriteLock维护一对关联的锁,一个用于只读操作一个用于写。在没有写线程的情况下一个读锁可能会同时被多个读线程持有。写锁是独占的,您可以使用JDK中的ReentrantReadWriteLock要执行这一规则,它最多支持。65535个写锁和65535个读锁。
45) 多线程的繁忙周期是多少?
繁忙循环是指程序员使用循环让线程等待,这与传统方法不同。wait(), sleep() 或 yield() 他们都放弃了CPU控件,而忙碌的循环不会放弃CPU,它正在运行一个空循环。这样做的目的是为了保留CPU缓存,在多核系统中,一个等待线程在唤醒时可能会在另一个内核中运行,这将重建缓存。它可用于避免重建缓存并减少等待重建的时间。您可以查看 这篇文章 获取更多信息。
46)volatile 变量和 atomic 变量有什么关系呢?
这是一个有趣的问题。第一,volatile 变量和 atomic 变量看起来相似,但功能不同。Volatile变数确保了先前的关系,也就是说。写入操作在后续读取之前进行。, 但它不能保证原子性。例如,volatile修饰count变量那么 count++ 操作不是原子的。和AtomicInteger类提供的atomic方法可以使此操作成为原子操作。getAndIncrement()该方法将自动执行增量操作以将当前值加到1,其他数据类型和引用变量也可以执行类似的操作。
47) 如果同步块中的线程抛出异常,会发生什么情况?
这个问题有很多漏洞。Java程序员,如果你能想到锁是否释放了这个线索来回答,还是有一些希望回答正确的。无论您的同步块是正常退出还是异常退出,里面的线程都会释放锁,所以我更喜欢同步块而不是锁接口,因为它不需要花费精力来释放锁,而且这个函数可以在 finally block 释放锁实现。
48) 单箱模式下的双重检查锁是什么?
这个问题出现在Java他们经常在面试中被问到,但面试官对回答这个问题的满意度只是50%。一半的人不会写双锁,一半的人不会说出它的隐患和Java1.5如何改正它。这实际上是一种创建线程安全单例的旧方法。当第一次创建单例实例时,它试图使用单个锁来优化性能,但这太复杂了。JDK1.4这是一个失败,我个人不喜欢它。无论如何,即使你不喜欢它,你仍然需要知道它,因为它经常被问到。您可以查看 how double checked locking on Singleton works 这篇文章获取更多信息。
49) 如何在Java创建线程安全Singleton?
这是对上述问题的跟进。如果您不喜欢双重锁定检查,而面试官要求创建它Singleton作为班级的替代品,你可以利用这一点。JVM类加载和静态变量初始化功能来创建。Singleton实例,或使用枚举类型创建Singleton我非常喜欢这种方法。您可以查看 这篇文章 获取更多信息。
50) 写出3您遵循的多线程最佳实践。
我最喜欢这种问题,我相信您在编写并发代码以提高性能时会遵循一些最佳实践。以下是我认为最好的三个实践。Java程序员应遵循以下原则:
- 给你的线程起一个有意义的名字。 这可以很方便地找到bug或追踪。OrderProcessor, QuoteProcessor or TradeProcessor 这个名字更多 Thread-1. Thread-2 and Thread-3 更好的是,给线程一个与它想要完成的任务相关的名称,甚至所有的主框架JDK所有人都遵循这一最佳实践。
- 避免锁定并缩小同步范围。 锁很贵,上下文切换也更耗时。尝试使用同步和锁定来最小化关键区域。因此,我更喜欢同步块而不是同步方法,后者使我能够对锁进行绝对控制。
- 多用途同步类用法较少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()方法有什么关系呢?
Java程序中wait 和 sleep会导致某种形式的停顿,这可以满足不同的需求。wait()方法用于线程间通信。如果等待条件为真,并且其他线程被唤醒,它将释放锁。sleep()方法仅发布CPU资源,或者让当前线程停止执行一段时间,但不释放锁。您可以查看 这篇文章 获取更多信息。
以上就是50道热门Java多线程和并行面试问题。我没有分享所有问题的答案,但我为未来的读者提供了足够的提示和线索来找到答案。如果你真的找不到问题的答案,请联系我,我会添加它。本文不仅可以用于准备采访,还可以检查您对线程问题的理解,如多线程、并发性、设计模式和争用条件、死锁和线程安全。我打算把这篇文章中的所有问题Java一大堆多线程的问题,但没有你的帮助,恐怖就不可能完成。你也可以与我分享任何其他的问题,包括那些你已经被问到但还没有找到答案的问题。这篇文章适合初学者或有经验的人。Java开发人员非常有用,在两年、三年甚至五六年后再次阅读它将使您受益匪浅。它可以扩展到初学者,特别有用,因为它可以扩大他们的知识。我会不断更新这些问题。你可以在文章后面的评论中提问,分享和回答问题,一起完善这道面试问题。
作者: Matrix海子
出处: http://www.cnblogs.com/dolphin0520/
本博客未注明转载的文章均为作者所有。 Matrix海子 与博客园共享。欢迎转载,但未经作者同意,您必须保留此声明,并在文章页面明显位置给出原始连接,否则您保留追究法律责任的权利。
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除