多线程竞争锁,为什么会引起上下文切换?

多线程竞争锁,为什么会引起上下文切换?

在多线程并发的情况下,线程竞争锁,那么就不可避免的会产生阻塞,一旦产生阻塞,该线程就处于wating状态。那么该线程放弃CPU的使用权,那么在切换至下一个任务或者线程时,需要保存该线程的状态和一些环境信息。
所以在多线程并发下,多线程竞争锁,会引起上下文切换。
频繁的上下文切换,会导致系统的开销就越大,所以尽量使用一些方法来减少上下文的切换。

如何减少上下文的切换?

  • 无锁并发编程。
    多线程竞争锁时,会引起上下文切换、所以多线程在处理数据时,可以用一些方法来避免使用锁。如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。
  • CAS算法
    Java的Atomic包使用CAS算法来更新数据,而不需要加锁。
  • 使用最少线程
    避免创建不需要的线程,比如任务很少,但是创建了很多的线程来处理,这样会造成大量的线程都处于等待状态。
  • 协程
    在单线程里实现多任务的调度,并在单线程里维持多人任务间的切换。

Java并发编程的艺术

你可能感兴趣的:(java,开发语言,后端)