java多线程介绍

一、什么是线程

  要解释线程,我们首先要从进程说起。

1. 什么是进程?

  进程是程序运行的一个实例,进程是系统分配资源的最小单位,每个进程都有各自的资源(内存空间等)。每个进程都有自己独立的运行空间,比如电脑打开word,系统就会为这个应用分配一定的空间运行该程序。

2. 什么是线程?

线程是进程的运行实体,是系统程序执行的最小单位。线程自己不拥有资源,只拥有运行时必不可少的一些资源,一个进程可以有多个线程,这些线程可以共享该进程的资源。广义来说,线程就是轻量级的进程。

3. 进程和线程的区别?
  • 进程是系统分配资源的最小单位,线程是程序执行的最小单位。
  • 不同进程间是相互独立的地址空间,而线程可以共享进程的资源。
  • 进程间切换开销大,利于资源的保护和隔离。线程间切换开销小,但是不利于资源的保护和隔离。

二、线程的优势

1.发挥多处理器的强大能力

  由于基本的调度单位是线程,那么如果程序中只有一个线程,那么最多只能在一个处理器上运行,那么对于现在普遍多核处理器的电脑上,将是极大的资源浪费,导致我们的程序运行效率低下。即使在双核处理器下,一半的资源的都会被浪费, 如果是四核处理器,那么将会有75%的资源不能使用,这是极大的浪费。
  因此,只要我们能正确的使用多线程能力,那么就会使我们机器的资源得以充分利用,从而提高程序的吞吐率。即使是在单个线程中,也可以提高系统的吞吐率,比如当程序在运行某个需要耗时较长的IO操作时,就可以执行另一个线程的操作,从而使得处理器资源得以充分利用。

2.建模的简单性

  在程序设计时,程序中只包含一种类型的任务,比包含多种不同类型的任务要简单,因此,我们在设计程序的时候,可以通过使用线程,将复杂并且异步的工作流进一步分解为一组简单并且同步的工作流,每个工作流在一个单独的线程中运行,并在特定的同步位置进行交互。

3.异步事件的简化处理

  服务器应用程序在来自多个远程客户端的套接字连接请求时,如果为每个连接都分配其各自的线程并使用同步IO,那么就会降低这类程序的分发难度。
  如果某个应用程序对套接字执行读操作而此时数据还没有到来,那么这个读操作将一直阻塞,直到有数据到达。在单线程应用中,这样做会使得这个线程被阻塞,从而不能执行其他任务,最终导致程序效率低下。为了避免这个问题,单线程程序会必须使用非阻塞IO,这种IO的复杂性远远高于同步IO,并且很容易出错。然而,如果每个请求都有自己的处理线程,那么在处理请求时发生的阻塞不会影响其他请求的处理。


三、线程带来的风险

  java对线程的支持时一把双刃剑,有优点那么必然也有缺点,下面我们就看看线程会给我们的程序带来哪些风险。

1.线程安全性

  线程安全性可能是非常复杂的,在没有充足同步的情况下,多个线程中的操作执行顺序是不可预测的,有时候还可能产生奇怪的结果。
  当多个线程要共享相同的内存地址空间,并且是并发运行,这种情况下,它们可能会访问或者修改其他线程正在使用的变量。这是一种极大的便利,可以不使用线程间通信的机制,就可以很容易的实现数据共享。但是它也带来了巨大的风险,线程会由于无法预料的数据变化而产生超出我们预期的结果。由于多个线程访问和修改相同的变量,在程序执行过程中,对数据的修改和访问顺序我们无法预测和分析。要使多线程程序行为可以预测,必须对共享变量的访问操作进行协同,这样才不会在线程之间发生干扰。幸运的是,java提供了各种同步的机制来协同这种访问。

2.活跃性问题

活跃性关注的目标是“某件正确的事情最终一定会发生”。当某个操作无法执行下去,就会发生活跃性问题,在串行程序中,活跃性问题形式之一就是无意中造成死循环,从而使循环之后的代码无法得到执行。而多线程会带来其他的一些活跃性问题。

3.性能问题

在设计良好的并发程序中,线程能提升程序的性能,但无论如何,线程总会带来某种程度的运行开销。多线程程序中,当线程调度器临时挂起活跃线程并转而运行另一个线程时,就会频繁的出现上下文切换操作,这种操作将带来极大的性能开销:保存和恢复执行上下文,丢失局部性,并且cpu时间将更多的花在线程调度而不是运行上,从而导致性能的下降。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值