多线程操作类对比(Java和C#)

 
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#线程池注意:
保持线程中的操作都是短暂的是非常重要的。不要在线程池中放入长时间运行的操作,或者阻塞工作线程。这将导致所有工作线程变得繁忙,从而无法服务用户操作。这会导致性能问题和非常难以调试的错误。
  请注意线程池中的工作线程都是后台线程。这意味着当所有的前台线程(包括主程序线程)完成后,所有的后台线程将停止工作。
 

posted @ 2020-12-13 10:47  windge  阅读(498)  评论(0编辑  收藏  举报