java多线程介绍
Posted 大数据最好
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java多线程介绍相关的知识,希望对你有一定的参考价值。
文章目录
一、什么是线程
要解释线程,我们首先要从进程说起。
1. 什么是进程?
进程是程序运行的一个实例,进程是系统分配资源的最小单位,每个进程都有各自的资源(内存空间等)。每个进程都有自己独立的运行空间,比如电脑打开word,系统就会为这个应用分配一定的空间运行该程序。
2. 什么是线程?
线程是进程的运行实体,是系统程序执行的最小单位。线程自己不拥有资源,只拥有运行时必不可少的一些资源,一个进程可以有多个线程,这些线程可以共享该进程的资源。广义来说,线程就是轻量级的进程。
3. 进程和线程的区别?
- 进程是系统分配资源的最小单位,线程是程序执行的最小单位。
- 不同进程间是相互独立的地址空间,而线程可以共享进程的资源。
- 进程间切换开销大,利于资源的保护和隔离。线程间切换开销小,但是不利于资源的保护和隔离。
二、线程的优势
1.发挥多处理器的强大能力
由于基本的调度单位是线程,那么如果程序中只有一个线程,那么最多只能在一个处理器上运行,那么对于现在普遍多核处理器的电脑上,将是极大的资源浪费,导致我们的程序运行效率低下。即使在双核处理器下,一半的资源的都会被浪费, 如果是四核处理器,那么将会有75%的资源不能使用,这是极大的浪费。
因此,只要我们能正确的使用多线程能力,那么就会使我们机器的资源得以充分利用,从而提高程序的吞吐率。即使是在单个线程中,也可以提高系统的吞吐率,比如当程序在运行某个需要耗时较长的IO操作时,就可以执行另一个线程的操作,从而使得处理器资源得以充分利用。
2.建模的简单性
在程序设计时,程序中只包含一种类型的任务,比包含多种不同类型的任务要简单,因此,我们在设计程序的时候,可以通过使用线程,将复杂并且异步的工作流进一步分解为一组简单并且同步的工作流,每个工作流在一个单独的线程中运行,并在特定的同步位置进行交互。
3.异步事件的简化处理
服务器应用程序在来自多个远程客户端的套接字连接请求时,如果为每个连接都分配其各自的线程并使用同步IO,那么就会降低这类程序的分发难度。
如果某个应用程序对套接字执行读操作而此时数据还没有到来,那么这个读操作将一直阻塞,直到有数据到达。在单线程应用中,这样做会使得这个线程被阻塞,从而不能执行其他任务,最终导致程序效率低下。为了避免这个问题,单线程程序会必须使用非阻塞IO,这种IO的复杂性远远高于同步IO,并且很容易出错。然而,如果每个请求都有自己的处理线程,那么在处理请求时发生的阻塞不会影响其他请求的处理。
三、线程带来的风险
java对线程的支持时一把双刃剑,有优点那么必然也有缺点,下面我们就看看线程会给我们的程序带来哪些风险。
1.线程安全性
线程安全性可能是非常复杂的,在没有充足同步的情况下,多个线程中的操作执行顺序是不可预测的,有时候还可能产生奇怪的结果。
当多个线程要共享相同的内存地址空间,并且是并发运行,这种情况下,它们可能会访问或者修改其他线程正在使用的变量。这是一种极大的便利,可以不使用线程间通信的机制,就可以很容易的实现数据共享。但是它也带来了巨大的风险,线程会由于无法预料的数据变化而产生超出我们预期的结果。由于多个线程访问和修改相同的变量,在程序执行过程中,对数据的修改和访问顺序我们无法预测和分析。要使多线程程序行为可以预测,必须对共享变量的访问操作进行协同,这样才不会在线程之间发生干扰。幸运的是,java提供了各种同步的机制来协同这种访问。
2.活跃性问题
活跃性关注的目标是“某件正确的事情最终一定会发生”。当某个操作无法执行下去,就会发生活跃性问题,在串行程序中,活跃性问题形式之一就是无意中造成死循环,从而使循环之后的代码无法得到执行。而多线程会带来其他的一些活跃性问题。
3.性能问题
在设计良好的并发程序中,线程能提升程序的性能,但无论如何,线程总会带来某种程度的运行开销。多线程程序中,当线程调度器临时挂起活跃线程并转而运行另一个线程时,就会频繁的出现上下文切换操作,这种操作将带来极大的性能开销:保存和恢复执行上下文,丢失局部性,并且cpu时间将更多的花在线程调度而不是运行上,从而导致性能的下降。
以上是关于java多线程介绍的主要内容,如果未能解决你的问题,请参考以下文章
java 局部静态变量在多线程环境下是不是有线程安全问题??