[Java 并发编程] 2. 使用多线程的成本

2020-08-09

从单线程应用程序到多线程应用程序不仅仅需要考虑多线程应用程序更加高效,我们还需要考虑使用多线程的成本。使用多线程技术时不要仅仅因为你会使用多线程技术,你应该有一个更好的想法,比如更好的处理线程安全问题,以及多线程使用成本。尽可能的去测试多线程应用程序的性能以及响应速度,而不是靠猜想。

成本

  • 更复杂的程序设计
  • 上下文切换的开销

更复杂的程序设计

  • 在某些情况下,一个多线程应用程序比单线程应用程序更加简单,但是在某些特殊情况下要更加复杂。
  • 在多个线程引用了同一个共享变量的情况下,多线程应用程序比单线程应用程序使用起来更加复杂,因为需要考虑线程安全问题,不正确的线程同步问题出现的问题往往防不胜防。

上下文切换的开销

  • 当一个CPU从当前线程切换的执行另外一个线程时,CPU需要保存当前线程的本地数据以及程序指针等等,再有另外一个线程切换到当前线程时,需要重新读取本地数据和程序指针等,这个交换的执行过程叫做上下文切换。
  • 上下文切换的成本并不便宜。

减少上下文切换

  • 无锁并发编程:多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一些方法来避免使用锁。
  • CAS算法:Java的atomic包使用CAS算法来更新数据,而不需要加锁。
  • 使用最少线程:避免创建不需要的线程。
  • 协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。