Java多线程

2023-05-16

并发

线程状态

Debug调试,线程模式。
在这里插入图片描述

  • java:6种状态

    • NEW(新建)—— start
    • RUNNABLE(就绪 | 运行 | 阻塞I/O)—— cpu 调度
    • TERMINATED(终结)—— 代码执行完毕
    • BLOCKED(阻塞)—— 获取锁失败
    • WAITING(等待) ——获得锁的wait()
    • TIMED_WAITING(等待有时限) ——获得锁的wait(long)或者sleep(long)
  • 操作系统:5种

    • 新建
    • 就绪(可以分到CPU时间)
    • 运行(分到CPU时间)
    • 终结
    • 阻塞(分不到CPU时间)

线程池7个参数

  1. corePoolSize ——核心线程
  2. maximumPoolSize ——最大线程(包含救急线程)
  3. keepAliveTime——生存时间(空闲救急线程生存时间)
  4. unit——时间单位
  5. workQueue——阻塞队列(核心线程满后,放入任务队列,任务队列满启用救急线程)
  6. threadFactory——线程工厂
  7. handler——拒绝策略(当核心线程满,任务队列满,救急线程满时,拒绝任务策略)
ThreadPoolExecutor threadPoolExecutor=new ThreadPoolExecutor(
        2,
        3,
        0,
        TimeUnit.MILLISECONDS,
        workQueue,
        r -> new Thread(r,"myThread"+c.getAndIncrement()),
        new ThreadPoolExecutor.AbortPolicy()
);
拒绝策略
//AbortPolicy():抛出异常
//CallerRunsPolicy():由调用者执行
//DiscardPolicy():丢弃任务
//DiscardOldestPolicy():丢弃队列中最老任务

sleep VS wait

共同点:都会暂时放弃CPU使用权,进入阻塞状态。
不同点:

  • 方法归宿不同
    • sleep是Thread的静态方法。
    • wait是Object成员方法。每个对象都有。
  • 醒来时机不同
    • wait(long) 和wait() 能被notify唤醒
    • 都可以被打断唤醒。
  • 锁特性不同
    • wait方法必须先获取wait对象锁,sleep则不用
    • wait方法会释放锁,允许其他线程获取锁。
    • sleep如果在synchronized代码块中执行,并不会释放对象锁。

线程同步

synchronized :可以使用wait、notify实现。
lock:可以使用条件变量实现。

lock VS synchronized

  1. 语法层面:
    • synchronized 是关键字,源码在jvm中,C++实现。
    • Lock是接口,源码jdk提供,Java实现。
    • synchronized会自动释放锁;Lock手动释放锁。
  2. 功能层面
    • 都是悲观锁,具备基本的互斥、同步、锁重入功能。
    • Lock提供许多synchronized 不具备的功能,如获取等待状态、公平锁、可打断、可超时、多条件变量。
    • Lock适合不同场景的实现,ReentrantLock、ReentrantReadWritreLock。
  3. 性能层面
    • 在没有竞争时,synchronized做了很多优化,偏向锁、轻量级锁。
    • 在竞争激烈时,Lock有更好的性能。

公平与非公平

条件变量

  • await()
    会释放锁,并把线程加入等待队列(waiting queue)中。
  • signal()
    唤醒waiting queue中线程,加入block queue阻塞队列最后。

volatile能否保证线程安全?

线程安全3个方面:可见性、有序性、原子性。
不能,volatile只能保证可见性、有序性。

可见性原因、解决

原因:当一段代码执行次数极多时,会被JIT即时编译器优化,替换,下次执行JIT优化后的代码。导致不能读取已经更改的值。
解决:

  1. 不使用JIT热点代码的优化:-Xint;
  2. volatile修饰,保证可见性。

volatile位置

写操作:volatile的变量放在最后,保证上面写操作都被写屏障保护,保障不会出现先赋值在写操作。
读操作:volatile的变量放在第一个,保证下面都被读屏障保护,保障不会读取到未赋值的变量。

悲观锁与乐观锁

悲观锁:

  1. 就是线程必须占有了锁才能操作共享变量,每次只有一个线程占锁成功,获得锁失败的线程都要等待。
  2. 线程会从运行到阻塞频繁上下文切换,影响性能。
  3. synchronized和lock锁都会有几次重试操作,减少阻塞。

乐观锁:

  1. 无需加锁,每次只有一个线程修改共享数据成功,其他失败线程不用停止,不断尝试直到成功。
  2. 线程是一直运行,不涉及线程上下文切换。
  3. 多核CPU,线程数不应超过cpu核数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java多线程 的相关文章

  • 使用 Amazon EC2 启动 Windows 虚拟机

    本教程将教授您如何使用 Amazon Elastic Compute Cloud EC2 来启动 配置和连接至 Windows 虚拟机 Amazon EC2 是用于在云中创建和运行虚拟机 xff08 我们将这些虚拟机称为 实例 xff09
  • linux ss 命令用法说明

    ss 是 Socket Statistics 的缩写 ss 命令可以用来获取 socket 统计信息 xff0c 它显示的内容和 netstat 类似 但 ss 的优势在于它能够显示更多更详细的有关 TCP 和连接状态的信息 xff0c 而
  • 谷歌浏览器 跨域遇到的坑 cors 错误(亲测可行)

    浏览器版本 xff1a 一 现象 xff1a 解决方案 xff1a 方案一 xff1a xff08 已论证 xff09 步骤1 xff1a 谷歌浏览器 打开 chrome flags block insecure private netwo
  • 安装Visual Studio 2015时出现安装包丢失或损坏

    1 现象描述 在线安装vs时 xff0c 在线下载一直为0 xff0c 提示网络异常 xff0c 检查网络 xff1b 实际网络是能联网的 离线安装ISO xff0c 安装1分钟左右 提示安装包损坏或丢失 xff0c 选择从inter下载或
  • 数据库实验-数据查询练习

    用SQL语句完成以下查询 1 查询所在系为 CS 的学生学号和姓名 xff1b select sno sname from student where sdept 61 39 CS 39 2 查询选修了3号课程的学生学号 xff1b sel
  • web前端播放视频基础(多种格式,mp4, ogg, flv)(普通项目和vue项目)

    前端播放视频 满足一般播放条件 话不多说 先上代码 以下包含我能做出来可以做出来播放的视频格式 测试ok 可能还有ogg和wmv的格式可以播放 但我没测试通过 所以不展示 span class token keyword if span s
  • javascript中正则匹配多个条件, 常用正则匹配, 正则详解

    javascript中正则匹配多个条件 常用正则匹配 正则表达式常用方法实现其他的常用正则匹配详解 注意 本篇文章是根据在下日常编码过程中逐渐丰富的 越往后看 收获越丰富 收藏起来以后随时回顾 准备工作 1 汉字和unicode码的在线转换
  • antd react ProTable 基本使用

    antd react pro系列 ProTable 基本使用 一 安装二 常用字段 antd 全称 Ant Design 是目前来说运用最广泛的 react 的 ui 框架 下文就用略写 antd 代替了 pro系列不做过多解释 毕竟ui框
  • canvas插件 fabric.js 使用

    fabric js使用 fabric js 是 常用的 canvas 插件1 在项目中使用2 特殊用法 基本设置 画板数据的导入导出 遮罩 Pattern 引用官网案例 多个对象合并 并设置为 fabric 背景 适用于变色和更多场景 把
  • 前端 百度地图 javascript api 在线地图, 离线地图

    前端 百度地图 javascript api 在线地图 离线地图 在线地图登录百度api获取key注册为个人开发者后 创建应用 离线地图 瓦片地图 下载离线瓦片地图二 下载api js 一些常用api难找见的api 在线地图 在线地图 百度
  • 基于 jquery imagesloaded masonry 实现的瀑布流图片展示

    基于 jquery imagesloaded masonry 实现的瀑布流图片展示 基于 jquery imagesloaded masonry 实现的瀑布流图片展示简述 xff0c 版本 xff0c 及插件案例htmlcssjs 基于 j
  • 微信小程序开发双重for循环, wx: if else 语法

    微信小程序开发 双重for循环 多重for循环 重点在于 wx for item 61 34 problemItem 34 和 wx for index 61 34 idx 34 确定循环的 item 和index 理论上可以实现无上线条循
  • react hocks ggeditor 脑图开发(双向细目表), 实用技巧

    ggeditor脑图开发 目录 配置说明api介绍 xff0c 引入插件 xff0c 获取api xff08 withPropsAPI xff09 xff0c 获取node api xff0c 常用api汇总 xff0c 绑定事件功能实现
  • TX2开发板CMake Error at CMakeLists.txt:11 (message): FATAL: In-source builds are not allowed.

    因为之前已经cmake过 把之前cmake生成的build目录中的文件 xff0c 以及opencv目录下生成的CmakeCache txt删除就可以解决了
  • 玩客云刷ARMBIAN当服务器过程记录

    玩客云的可玩性 1 可以刷成电视 43 游戏盒子的双系统 也可以刷成单独的电视盒子和游戏盒子 不过因为内存有限放不了多少游戏 还是建议用外置SD卡存储游戏比较合适 2 刷成Armbian linux系统 xff08 可以实现docker 可
  • Android9.0从系统层面修改android_id

    原因 按照android官方说明 xff0c android id会随着恢复出厂设置或重新烧录系统 xff0c 或切换用户登陆都会重新随机生成新的anroid id 因此对于一些依赖anroid id做唯一识别标识之一的软件来说就有问题了
  • Linux系统下基于Docker安装Yapi,并且迁移Yapi数据

    本文主要讲四个部分 xff1a 1 什么是Yapi 2 Centos7 下基于docker安装Yapi 3 Yapi数据迁移 4 利用Nginx反向代理 什么是Yapi YApi 是高效 易用 功能强大的 api 管理平台 xff0c 旨在
  • C语言多文件编程基本格式

    1 背景 xff1a 用一个丢骰子的简单案例熟悉了C语言多文件编程该咋写 2 格式 xff08 1 xff09 主函数文件main c 文件头part1 所有要使用的函数 include include include 文件头part2 放
  • STM32汇编程序及点灯实验

    目录 一 Keil下编写汇编程序1 新建工程2 配置环境3 测试代码 二 HEX文件格式说明1 简介2 格式说明3 举例说明 上述工程生成的 hex文件 三 基于STM32 汇编每间隔1秒钟闪烁一次LED的程序 一 Keil下编写汇编程序
  • c++单向链表逆序

    include lt iostream gt using namespace std struct node int data node next node createlist int n 创建一个链表 xff0c n为存储的数据个数 n

随机推荐

  • 目标检测6--NanodetPlus算法分析

    文章目录 1 简介2 辅助训练模块Assign Guidance Module3 损失函数4 标签匹配策略5 后处理介绍6 特征融合参考资料 欢迎访问个人网络日志 x1f339 x1f339 知行空间 x1f339 x1f339 1 简介
  • Couldn't find executable named map_saver below /opt/ros/indigo/share/map_server

    在使用 Mastering ROS for Robotics Programming PACKT 2015 学习ros xff0c 学习到第四章的时候 xff0c 先是安装Navigation一直找不到dependencies 换了源进行u
  • Linux之索引节点inode(index node)

    inode就是索引节点 xff0c 它用来存放档案及目录的基本信息 xff0c 包含时间 档名 使用者及群组等 inode 是 UNIX Linux 操作系统中的一种数据结构 xff0c 其本质是结构体 它包含了与文件系统中各个文件相关的一
  • String、StringBuffer、Stringbulider的区别

    java中用于处理字符串常用的有三个类 java lang String java lang StringBuffer java lang StrungBuilder 三者共同之处 都是final类 不允许被继承 xff0c 主要是从性能和
  • 常用集合List、Set、Map的比较

    概述 List Set Map都是接口 xff0c 前两个继承至Collection接口 xff0c Map为独立接口 List有序 xff0c 可重复 1 ArrayList 底层 xff1a 数组 xff1b 查询快 xff0c 增删慢
  • Apache中的默认编码

    好吧 xff0c 在Django上测试挺好的GBK编码的静态文件 xff0c 部署到Apache后乱码了 xff0c 默认编码变成了UTF 8 xff0c 可是meta中明明指定了charset为GBK的 xff1a lt meta htt
  • SpringDoc使用

    文章目录 1 SpringDoc简介2 SpringDoc基础使用 1 SpringDoc简介 SpringDoc是一款可以结合SpringBoot使用的API文档生成工具 2 SpringDoc基础使用 POM文件 span class
  • Result统一响应数据

    目录 1 响应数据的格式 1 1 状态码划分 1 3 响应数据的封装 2 统一数据返回 1 响应数据的格式 在分离的环境中 xff0c 我们前后交互就显得尤为重要 前端按照接口文档中的URL地址和参数要求发送请求 xff0c 接着后端对业务
  • SpringBoot实现全局异常处理器

    1 本文使用 64 ControllerAdvice 64 ExceptionHandler 进行全局的 Controller 层异常处理 不用在 Controller 层进行 try catch xff01 package com exa
  • 排序算法的对比

    冒泡排序VS选择排序 两者时间复杂度O n2 冒泡排序找最大值放在最后 xff0c 选择排序找最小值放在前面 选择排序属于不稳定排序 xff1b 选择排序一般情况下优于冒泡排序 xff0c 每轮只交换一次 如果集合有序度高 xff0c 则选
  • Redis基本操作

    安装Redis docker compose安装 单节点 version 34 3 3 34 services master image redis 6 0 container name redis environment 34 disco
  • RabbitMQ初级操作

    MQ 消息队列 xff1a 一种进程通信或同一进程的不同线程的通信方式 采用链表结构实现 xff0c 拥有权限的进程向消息队列写入或读取消息 常用MQ xff1a RabbitMQ ActiveMQ kafka xff0c Redis的Li
  • SpringBoot——邮件模块

    SpringBoot集成邮件模块 邮件协议 原文链接 xff1a https blog csdn net qq 37745470 article details 89094227 什么是SMTP xff1f SMTP全称为Simple Ma
  • JVM内存结构

    JVM JVM xff1a Java Virtual Machine xff0c Java虚拟机 xff0c 识别 class后缀文件 xff0c 解析class的指令 xff0c 调用操作系统函数完成操作 JVM JRE JDK关系 xf
  • JVM类加载机制

    类加载过程3个阶段 xff1a 1 加载 将类的字节码载入方法区 xff0c 并创建 Class对象 加载符号引用到类常量池 xff0c 只是有这个名字UnresolvedClass Name 如果类的父类没有加载 xff0c 先加载父类加
  • nginx 反向代理配置

    Nginx 反向代理 xff1a 其实客户端对代理是无感知的 xff0c 因为客户端不需要任何配置就可以访问 xff0c 我们只需要将请求发送到反向代理服务器 xff0c 由反向代理服务器去选择目标服务器获取数据后 xff0c 在返回给客户
  • Cookies 和 Session的区别

    1 cookie 是一种发送到 客户 浏览器的文本串句柄 xff0c 并保存在客户机硬盘上 xff0c 可以用来在某个WEB站点会话间持久的保持数据 2 session 其实指的就是访问者从到达某个特定主页到离开为止的那段时间 Sessio
  • HashMap详解

    HashMap 16 xff0c 0 75 为什么能快速查找 xff1f put操作放入key时 获取key的hash值 在原始hash值的基础上再次获取hash值 二次hash值与容量取模运算 capacity 获得桶下标 根据桶下标 x
  • 设计模式——单例模式

    单例模式 饿汉式 类加载阶段被初始化就会创建实例 提前创建 span class token keyword class span span class token class name Singleton span span class
  • Java多线程

    并发 线程状态 Debug调试 xff0c 线程模式 java xff1a 6种状态 NEW 新建 startRUNNABLE 就绪 运行 阻塞I O cpu 调度TERMINATED 终结 代码执行完毕BLOCKED 阻塞 获取锁失败WA