Marvel-Site Marvel-Site
首页
  • Java

    • Java基础
    • Java进阶
    • Java容器
    • Java并发编程
    • Java虚拟机
  • 计算机基础

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • Linux
  • 框架|中间件

    • Spring
    • MySQL
    • Redis
    • MQ
    • Zookeeper
    • Git
  • 架构

    • 分布式
    • 高并发
    • 高可用
    • 架构
  • 框架

    • React
    • 其他
  • 实用工具
  • 安装配置

    • Linux
    • Windows
    • Mac
  • 开发工具

    • IDEA
    • VsCode
  • 关于
  • 收藏
  • 草稿
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)

Marvel

吾必当乘此羽葆盖车
首页
  • Java

    • Java基础
    • Java进阶
    • Java容器
    • Java并发编程
    • Java虚拟机
  • 计算机基础

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • Linux
  • 框架|中间件

    • Spring
    • MySQL
    • Redis
    • MQ
    • Zookeeper
    • Git
  • 架构

    • 分布式
    • 高并发
    • 高可用
    • 架构
  • 框架

    • React
    • 其他
  • 实用工具
  • 安装配置

    • Linux
    • Windows
    • Mac
  • 开发工具

    • IDEA
    • VsCode
  • 关于
  • 收藏
  • 草稿
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)
  • Java

    • Java基础

    • Java进阶

    • Java容器

    • Java并发编程

      • 并发编程基本概念
      • 多线程
        • 使用多线程的原因
        • 多线程的优缺点
        • Runnable和Callable的区别
        • sleep()和wait()的区别
      • 创建多线程的方法
      • 比较与交换CAS
      • Java对象头与Monitor监视器
      • Java主流锁
      • synchronized关键字
      • volatile关键字
      • 线程池
      • 原子类Atomic
      • LockSupport工具
      • 抽象队列同步器AQS
      • ThreadLocal深度理解
      • 多线程循环打印代码
      • 线程等待和唤醒的三种方式
      • ReentrantLock非公平锁的源码分析
    • Java虚拟机

    • 常见面试题

  • 计算机基础

  • 框架|中间件

  • 架构

  • 后端
  • Java
  • Java并发编程
Marvel
2022-07-13
目录

多线程

# 多线程

# 使用多线程的原因

并发编程的目的就是为了能提高程序的执行效率提高程序运行速度,但是并发编程并不总是能提高程序运行速度的。

  • 从计算机底层来说:线程是程序执行的最小单位,线程间的切换成本低。多核CPU意味着多线程可以同时运行,减少了线程上下文切换的开销。

  • 从互联网发展趋势来说:现在系统动不动就要求百万七万级的并发量,多线程并发编程正式开发高并发系统的基础,利用多线程机制可以大大提高系统整体的并发能力和性能。

单核时代多线程的意义?

在单核时代多线程主要是为了提高进程利用CPU和IO系统的效率。假设只运行一个Java进程的情况,当我们请求IO的时候,如果Java进程只有一个线程,此线程被IO阻塞则整个进程就被阻塞了。CPU和IO设备只有一个在运行,那么系统效率大大降低。当使用多线程的时候,一个线程被IO阻塞,其他线程还可以继续使用CPU,从而提高了Java进程利用系统资源的整体效率。

多核时代多线程的意义?

多核时代多线程主要是为了提高进程利用多核CPU的能力。计算一个复杂的任务,我们只用一个线程的话,无论系统有几个CPU核心,都只有一个CPU核心被利用。当创建多个线程时,这些线程可以在多个CPU上执行,效率会显著提高。

# 多线程的优缺点

优点:

  • 充分利用CPU,避免CPU空转
  • 程序相应更快。

缺点:

  • 上下文切换的开销大

    当CPU从执行一个线程到切换到执行另外一个线程时,他需要先存储当前线程的本地数据,程序指针,然后加载另外一个线程的本地数据,程序指针,最后才开始执行。这种切换称为上下文切换。CPU会在一个上下文中执行一个线程,然后切换到另一个上下文中执行另外一个线程,上下文切换费时,如果没必要尽量减少上下文切换的发生。

  • 增加资源消耗

    线程在运行时需要从计算机里面得到一些资源。除了CPU,线程还需要一些内存来维持它的虚拟机栈栈。

  • 编程更加复杂,需要考虑多线程安全的问题。

  • 容易造成内存泄漏、死锁等问题

# Runnable和Callable的区别

  • Callable定义的方法是call(),而Runnable定义的方法是run()
  • Callable的call方法可以有返回值,而Runnable的run方法不能有返回值。
  • Callable的call方法可以抛出异常,而Runnable的run方法不能抛出异常。

# sleep()和wait()的区别

  • sleep()属于Thread类,wait()方法属于Object类。
  • 两者都可以暂停线程的执行。
  • 最主要区别:sleep没有释放锁,wait释放锁。
  • wait通常被用于线程间交互,sleep通常被用于暂停执行。
  • 使用wait、notify、notifyAll只能在同步方法或同步代码块中使用。
  • wait被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的notfiy和notifyAll方法,或者使用wait(long timeout)超时后线程会自动苏醒。sleep方法执行后,线程会自动继续运行。
编辑 (opens new window)
#Java#JUC
上次更新: 2023/08/20, 21:21:52
并发编程基本概念
创建多线程的方法

← 并发编程基本概念 创建多线程的方法→

最近更新
01
位运算
05-21
02
二叉树
05-12
03
Spring三级缓存解决循环依赖
03-25
更多文章>
Theme by Vdoing | Copyright © 2022-2024 Marvel
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式