C#
|
Java
|
备注说明
|
Semaphore/SemaphoreSlim
|
Semaphore
|
|
AutoResetEvent/ManualResetEventSlim
|
ReentrantLock.newCondition
|
|
CountdownEvent
|
CountDownLatch
|
|
Barrier
|
CyclicBarrier
|
|
ReaderWriterLockSlim
|
ReentrantReadWriteLock
|
|
volatile
|
volatile
|
一样
|
Task
|
Future/FutureTask
|
有一点神似
|
ThreadLocal
|
ThreadLocal
|
|
C#中带Slim是混合模式,不带的是内核模式。
当线程处于阻塞状态时,只会占用尽可能少的CPU时间。然而,这意味着将引入至少一次所谓的上下文切换( context switch),上下文切换是指操作系统的线程调度器。该调度器会保存等待的线程的状态,并切换到另一个.线程,依次恢复等待的线程的状态。这需要消耗相当多的资源。然而,如果线程要被挂起很,长时间,那么这样做是值得的。这种方式又被称为内核模式(kernel-mode),因为只有操作系统的内核才能阻止线程使用CPU时间。
万一线程只需要等待一小段时间,最好只是简单的等待,而不用将线程切换到阻塞状,态。虽然线程等待时会浪费CPU时间,但我们节省了上下文切换耗费的CPU时间。该方式又被称为用户模式(user-mode),该方式非常轻量,速度很快,但如果线程需要等待较长时间则会浪费大量的CPU时间。
为了利用好这两种方式,可以使用混合模式(hybrid),混合模式先尝试使用用户模式等,待,如果线程等待了足够长的时间,则会切换到阻塞状态以节省CPU资源。
C#线程池注意:
保持线程中的操作都是短暂的是非常重要的。不要在线程池中放入长时间运行的操作,或者阻塞工作线程。这将导致所有工作线程变得繁忙,从而无法服务用户操作。这会导致性能问题和非常难以调试的错误。
请注意线程池中的工作线程都是后台线程。这意味着当所有的前台线程(包括主程序线程)完成后,所有的后台线程将停止工作。
多线程操作类对比(Java和C#)
原文:https://www.cnblogs.com/Windge/p/14128028.html