《Java并发编程实战》课程笔记(七)

news2025/1/10 23:44:17

Java 线程

Java 线程的生命周期

通用的线程生命周期

  • 通用的线程生命周期基本上可以用下图这个“五态模型”来描述。
  • 这五态分别是:初始状态、可运行状态、运行状态、休眠状态和终止状态。
    在这里插入图片描述

Java 中线程的生命周期

  • Java 语言中线程共有六种状态,分别是:
    • NEW(初始化状态)
    • RUNNABLE(可运行 / 运行状态)
    • BLOCKED(阻塞状态)
    • WAITING(无时限等待)
    • TIMED_WAITING(有时限等待)
    • TERMINATED(终止状态)
      在这里插入图片描述
  • RUNNABLE 与 BLOCKED 的状态转换
    • 只有一种场景会触发这种转换,就是线程等待 synchronized 的隐式锁。
  • RUNNABLE 与 WAITING 的状态转换
    • 第⼀种场景,获得 synchronized 隐式锁的线程,调用无参数的 Object.wait() 方法。
    • 第二种场景,调用无参数的 Thread.join() 方法。其中的 join() 是⼀种线程同步方法。
    • 第三种场景,调用 LockSupport.park() 方法。
  • RUNNABLE 与 TIMED_WAITING 的状态转换
    • 调用带超时参数的 Thread.sleep(long millis) 方法;
    • 获得 synchronized 隐式锁的线程,调用带超时参数的 Object.wait(long timeout) 方法;
    • 调用带超时参数的 Thread.join(long millis) 方法;
    • 调用带超时参数的 LockSupport.parkNanos(Object blocker, long deadline) 方法;
    • 调用带超时参数的 LockSupport.parkUntil(long deadline) 方法。
  • 从 NEW 到 RUNNABLE 状态
    • 从 NEW 状态转换到 RUNNABLE 状态很简单,只要调用线程对象的 start() 方法就可以了。
  • 从 RUNNABLE 到 TERMINATED 状态
    • 线程执行完 run() 方法后,会自动转换到 TERMINATED 状态,当然如果执行 run() 方法的时候异常抛出,也会导致线程终止。
    • interrupt() 方法仅仅是通知线程,线程有机会执行一些后续操作,同时也可以无视这个通知。被 interrupt 的线程,是怎么收到通知的呢?一种是异常,另一种是主动检测。

创建多少线程才是合适的?

多线程的应用场景

  • 所谓提升性能,从度量的角度,主要是降低延迟,提高吞吐量。
  • 在并发编程领域,提升性能本质上就是提升硬件的利用率,再具体点来说,就是提升 I/O 的利用率和 CPU 的利用率。
  • 如果 CPU 和 I/O 设备的利用率都很低,那么可以尝试通过增加线程来提高吞吐量。
  • 创建多少线程合适,要看多线程具体的应用场景。
    • 对于 CPU 密集型的计算场景,理论上“线程的数量 = CPU 核数”就是最合适的。
    • 线程的数量一般会设置为“CPU 核数 + 1”。
    • 对于 I/O 密集型的计算场景,最佳线程数 = CPU 核数 * [ 1 +(I/O 耗时 / CPU 耗时)]

为什么局部变量是线程安全的?

局部变量存哪里?

  • 局部变量的作用域是方法内部,也就是说当方法执行完,局部变量就没用了,局部变量应该和方法同生共死。调用栈的栈帧就是和方法同生共死的,所以局部变量放到调用栈里那儿是相当的合理。

线程封闭

  • 方法里的局部变量,因为不会和其他线程共享,所以没有并发问题,这个思路很好,已经成为解决并发问题的⼀个重要技术,同时还有个响当当的名字叫做线程封闭即仅在单线程内访问数据
  • 由于不存在共享,所以即便不同步也不会有并发问题,性能杠杠的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/596245.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pytorch入门(三)深度学习模型的训练的基本步骤

文章目录 一、修改现有的网络模型二、模型的保存三、模型的加载四、模型的评估五、训练模型的完整套路六、使用GPU加速模型的训练七、模型训练完整的验证套路 一、修改现有的网络模型 import torchvision from torch import nn # pretrained 为True时会自动下载模型所对应的权…

ES6-ES13学习笔记(4.0)

includes函数 判断字符串是否存在指定字符 <!--* Author: RealRoad1083425287qq.com* Date: 2023-06-01 08:40:33* LastEditors: Mei* LastEditTime: 2023-06-01 08:58:54* FilePath: \vscode\ECMA\05\01.html* Description: * * Copyright (c) 2023 by ${git_name_ema…

Docker+Jenkins+Gitee自动化部署maven项目

1.简介 各位看官老爷&#xff0c;本文为Jenkins实战&#xff0c;注重实际过程&#xff0c;阅读完会有以下收获&#xff1a; 了解如何使用Docker安装Jenkins了解如何使用Jenkins部署maven项目了解如何使用JenkinsGitee实现自动化部署 2.Jenkins介绍 相信&#xff0c;正在读这…

美国频频对中国芯片出手,却没想到最先倒下的是美芯巨头

据报道指出全球知名的硬盘厂商西部数据已基本敲定与日本存储芯片巨头铠侠的合并计划&#xff0c;不过让人意外的是最终主导者将是铠侠而不是西部数据&#xff0c;这意味着西部数据将从此消失于历史之中。 西部数据是全球最大的硬盘厂商&#xff0c;它先后收购了知名硬盘厂商希捷…

【实用篇】Docker

文章目录 Docker实用篇1.初识Docker1.1.什么是Docker1.1.1.应用部署的环境问题1.1.2.Docker解决依赖兼容问题1.1.3.Docker解决操作系统环境差异1.1.4.小结 1.2.Docker和虚拟机的区别1.3.Docker架构1.3.1.镜像和容器1.3.2.DockerHub1.3.3.Docker架构1.3.4.小结 1.4.安装Docker1.…

springboot+vue高校班级管理系统 java 同学录校友录网站

本海滨学院班级回忆录管理员功能有个人中心&#xff0c;用户信息管理&#xff0c;班委信息管理&#xff0c;班级信息管理&#xff0c;加入班级管理&#xff0c;新闻信息管理&#xff0c;班级相册管理&#xff0c;活动信息管理&#xff0c;捐赠信息管理&#xff0c;论坛信息管理…

界面控件DevExpress ASP.NET新主题——Office 365暗黑主题的应用

DevExpress ASP.NET Web Forms Controls拥有针对Web表单&#xff08;包括报表&#xff09;的110种UI控件&#xff0c;DevExpress ASP.NET MVC Extensions是服务器端MVC扩展或客户端控件&#xff0c;由轻量级JavaScript小部件提供支持的70个高性能DevExpress ASP.NET Core Contr…

2023年6月跟教授学DAMA-CDGA/CDGP数据治理认证到这里

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

什么?要求设计一个循环队列?

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:讲解用c…

PortSwigger 基于不安全的反序列化漏洞

一、反序列化漏洞简单介绍 反序列化漏洞是指攻击者通过在应用程序中注入恶意的序列化对象来利用应用程序的反序列化功能&#xff0c;从而导致应用程序受到攻击的漏洞。 在一些编程语言和应用程序中&#xff0c;对象可以被序列化为一些字节流或字符串&#xff0c;然后在不同的应…

基于Java+SpringBoot+Vue前后端分离网课在线学习观看系统

博主介绍&#xff1a;✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

C#正则表达式的使用

C#正则表达式 System.Text.RegularExpressions.Regex 使用时需要引入命名空间 using System.Text.RegularExpressions; 如果不引用则写成 System.Text.RegularExpressions.Regex 使用方法如下&#xff1a; string str"测试123456"; string result""; re…

chatgpt赋能python:Python代码中的符号

Python代码中的符号 Python是一种简单易学的编程语言&#xff0c;拥有着广泛的应用领域&#xff0c;比如数据分析、人工智能、Web开发等等。在Python的编程过程中&#xff0c;符号是我们必须要熟悉的一部分。在本文中&#xff0c;我们将介绍Python代码中常见的符号&#xff0c…

华为OD机试真题B卷 Java 实现【人民币转换】,附详细解题思路

一、题目描述 考试题目和要点&#xff1a; 中文大写金额数字前应标明“人民币”字样。中文大写金额数字应用壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿、元、角、分、零、整等字样填写。中文大写金额数字到“元”为止的&#xff0c;在“元”之后&#xff0c;应…

【Python PyInstaller】零基础也能轻松掌握的学习路线与参考资料

一、Python PyInstaller介绍 Python PyInstaller是一个用于将Python应用程序打包成可执行文件的工具&#xff0c;支持Windows、Mac OS X和Linux平台。使用PyInstaller可以方便地将Python应用程序和所需的依赖项&#xff08;包括Python解释器本身&#xff09;打包成一个独立的可…

JS的DOM对象获取元素

测试1 getElementById <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdev…

I.MX RT1170:如何在SRAM/SDRAM运行程序

一般Flash为non-XIP时&#xff0c;我们需要在RAM上运行程序。还有一种情况&#xff0c;就是我们不想每次调试都要将程序写入Flash&#xff0c;然后由BootROM进行代码的拷贝和跳转&#xff0c;这样可以减少Flash的烧写次数。本篇文章就来讨论一下如何实现这两种情形的RAM代码运行…

chatgpt赋能python:如何更好地理解Python代码

如何更好地理解Python代码 引言 Python是一种高级编程语言&#xff0c;它越来越受欢迎。由于Python内置的强大功能和易学性&#xff0c;许多开发者选择使用Python来开发应用程序。但是&#xff0c;有时候我们可能会面临一些难以理解的代码&#xff0c;尤其是在阅读其他人的代…

一天吃透Spring面试八股文

内容摘自我的学习网站&#xff1a;topjavaer.cn Spring是一个轻量级的开源开发框架&#xff0c;主要用于管理 Java 应用程序中的组件和对象&#xff0c;并提供各种服务&#xff0c;如事务管理、安全控制、面向切面编程和远程访问等。它是一个综合性框架&#xff0c;可应用于所有…

解决Wsl2中Ubuntu无法更新软件的问题

本文排版不太好&#xff0c;详情可见笔记 有道云笔记 安装wsl2之后&#xff0c;在Ubuntu中更新软件&#xff0c;执行apt-get update命令报错&#xff0c;如下 rootjiangcheng01:~# sudo apt-get update Ign:1 http://mirrors.aliyun.com/ubuntu groovy InRelease Ign:2 http:…