2-并发篇

news2024/11/24 12:24:39

线程有哪些状态

java的线程状态有6种:
在这里插入图片描述
操作系统中有5状态的说明
注意java的runnable对应了就绪、运行、阻塞I/O
在这里插入图片描述

线程池的核心参数

主要是说线程池的一个实习类 threadPoolExecutor.class

1.corePoolSize 核心线程数据(可以为0)

最多保留的线程数

2.maximumPoolSize最大线程数目

核心线程+急救线程

3.keepAliveTime生存时间

针对急救线程

4.unit时间单位

针对急救线程

5.workQueue

阻塞队列

6.threadFactory线程工厂

可以为线程创建时起好名字

7.handler拒绝策略

四种

线程池的工作流程:
在这里插入图片描述

sleep 和 wait的区别

共同点:wait() ,wait(long) ,sleep(long)都是让线程暂时放弃cpu的使用权,进入阻塞状态
不同点:

  • .方法归属不同
    1.sleep(long)是Thread的静态方法
    2.而wait(),wait(long)都是Object的成员方法,每个对象都有
  • 醒来的时机不同
    1.执行sleep(long)和wait(long)的线程都会在等待响应毫秒后醒来
    2.wait(long) 和 wait()还可以被notify唤醒,wait()如果不唤醒就一直等下去
    3.他们都可以被打断唤醒
  • 锁特性不同
    1.wait方法的调用必须先获取wait对象的锁,而sleep则无此限制
    2.wait方法执行后会释放对象锁,允许其他线程获得该对象锁(我放弃,但你们还可以用)
    3.而sleep如果在synchronized代码块中执行,并不会释放对象锁(我放弃,你们也用不了)

lock vs synchronized

  • 语法层面
    • synchronized 是关键字,源码在jvm中,用c++语言实现的
    • Lock是接口,源码由jdk提供,用java语言实现
    • 使用synchronized时,退出同步代码块锁会自动释放,而使用Lock时,需要手动调用unlock方法释放锁
  • 功能层面
    • 二者均属于悲观锁、都具备基本的互斥、同步、锁重入功能
    • Lock提供了许多synchronized不具备的功能,例如获取等待状态、公平锁、可打断、可超时、多条件变量
    • Lock有适合不同场景的实现,如ReentrantLock、ReentrantReadWriteLock
  • 性能层面
    • 在没有竞争时,synchronized做了很多优化,如偏向锁、轻量级锁、性能不赖
    • 在竞争激励时,Lock的实现通常会提供更好的性能

volatile 能否保证线程安全

1.线程安全要考虑三个方面:可见性、有序性、原子性

  • 可见性指,一个线程对共享变量修改,另一个线程能看到最新的结果
  • 有序性指,一个线程内部代码按编写顺序执行
  • 原子性指,一个线程内多行代码以一个整体运行,期间不能有其他线程的代码插队
    2.volatile能够保证共享变量的可见性和有序性,但并不能保证原子性
  • 原子性举例
  • 可见性举例 高速重复的并非计算下,被jit优化调了
  • 有序性举例

悲观锁 vs 乐观锁

synchronized 和 lock 都是悲观锁的代表。
1.核心思想是,线程获取锁,才能操作共享变量。获取锁失败的线程,都得停下来等待。
2.线程从运行到阻塞,从阻塞到唤醒,涉及线程的上下文的切换,频繁切换,会影响性能。
3.synchronized 和 lock在获取锁失败的时候,会尝试重新获取几次。减少阻塞的机会

乐观锁的代表是 atomicinteger,是用cas(compare and swap一般要配合volatile一起使用的)来保证原子性
1.核心思想是无需加锁,每次只有一个线程能成功修改共享变量,其他失败的线程不需要停止,不断重试直至成功
2.由于线程一直运行,不需要阻塞,因此不涉及线程上下文切换。
3.它需要多核CPU支持,且线程不应超过CPU核数

HashTable vs ConcurrentHashMap

1.hashTable 和ConcurrentHashMap 都是线程安全的Map集合
2.Hashtable 并发度低,整个Hashtable对应一把锁,同一时刻,只能有一个线程操作它
3.1.8之前ConcurrentHashMap使用了segment+数组+链表的结构,每个Segment对应一把锁,如果多个线程访问不同的Segment,则不会冲突
4.1.9开始ConcurrentHashMap将数组的每个头节点作为锁,如果多个线程访问的头结点不同,则不会冲突

谈一谈对ThreadLocal的理解

1.ThreadLocal可以实现【资源对象】的线程隔离,让每个线程各用各的【资源对象】,避免争用引发的线程安全问题 。
2.ThreadLocal 同时实现了线程内的资源共享。
3.其原理是,每个线程内有一个ThreadLocalMap 类型的成员变量,用来存储资源对象

  • 调用set方法,就是以ThreadLocal自己作为key,资源对象作为value,放入当前线程的ThreadLocalMap集合中
  • 调用get方法,就是以ThreadLocal自己作为key,到当前线程中查找关联的资源值
  • 调用remove方法,就是以ThreadLocal自己作为key,移除当前线程关联的资源值

4.ThreadLocalMap里面的key为什么要设计成弱引用

  • thread 可能需要长时间运行(如线程池中的线程),如果key不再使用,需要在内存不足(GC)时释放其占用的内存
  • 但GC仅是让key的内存释放,后续还要根据key是否为null来进一步释放值的内存,释放时机有:
    • 获取key发现null key
    • set key时,会使用启发式扫描,清除临近的null key,启发次数与元素个数,是否发现null key有关
    • remove时(推荐),因为一般使用ThreadLocal时都把它作为静态变量,因此GC无法回收

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

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

相关文章

第一章:网络参考模型

一、专业术语 ISO---(International Organization for Standardization)国际标准化组织 OSI---(Open System Interconnection Reference Model)开放式系统互联通信参考模型 IEEE---(Institute of Electrical and Electronics Engi…

数字经济赋能乡村建设,助力乡村全面振兴

我国农村正朝着全面振兴的方向迈步发展,与此同时,我国高速发展的数字经济正在成为驱动经济社会全方位高质量发展的重要引擎,数字经济赋能乡村建设是乡村振兴的重要战略方向。数字经济通过将数据要素纳入农业生产、将数字产品和服务融入农民生…

3年经验,3轮技术面+1轮HR面,拿下字节30k*16薪offer,这些自动化测试面试题值得大家借鉴

面试一般分为技术面和hr面,形式的话很少有群面,少部分企业可能会有一个交叉面,不过总的来说,技术面基本就是考察你的专业技术水平的,hr面的话主要是看这个人的综合素质以及家庭情况符不符合公司要求,一般来…

K8s调度器Scheduler

当创建k8s pod的时候调度器会决定pod在哪个node上被创建且运行,调度器给apiserver发出了一个创建pod的api请求,apiserver首先将pod的基本信息保存在etcd,apiserver又会把这些信息给到每个node上的kubelet进程,kubelet一直在监听这…

Arduino UNO驱动土壤湿度传感器检测

Arduino UNO驱动土壤湿度传感器检测简介运行要求Arduino UNO与传感器接线程序展示实践效果总结简介 本次使用到是这个新款土壤湿度传感器! 这款电容式土壤湿度传感器区别于市面上绝大部分的电阻式传感器,采用电容感应原理来检测土壤湿度。避免了电阻式传…

电子技术——系统性分析反馈电压放大器

电子技术——系统性分析反馈电压放大器 在本节我们提供一个系统性的分析反馈电压放大器的方法。首先我们考虑反馈网络没有负载效应理想情况,其次我们考虑反馈网络有限阻抗下的非理想情况。总之,这种方法的思路在于,将非理想情况转换为理想情况…

CVE-2022-22947 SpringCloud GateWay SPEL RCE 漏洞分析

漏洞概要 Spring Cloud Gateway 是Spring Cloud 生态中的API网关,包含限流、过滤等API治理功能。 Spring官方在2022年3月1日发布新版本修复了Spring Cloud Gateway中的一处代码注入漏洞。当actuator端点开启或暴露时,可以通过http请求修改路由&#xff…

Linux 平台 RTSP server项目开发总结

先看下效果 Demo版本限制了只支持两个通道 每个通道只能连接一个客户端 FULL版本 没有这个限制 需要全功能版本 请联系博主 so库和测试demo可以点击这里下载 功能说明如下: 视频支持H264/H265音频支持AAC只支持LIVE 不支持文件点播支持TCP/UDP不支持RTCP支持多用…

Unity之ASE实现“软溶解”

前言 软溶解是相对之前将的硬边溶解来说的,软溶解顾名思义,就是溶解的边缘会比较平滑柔和,不像硬边溶解那样溶解边缘是清晰的。所以在游戏中也常被人所使用。效果请看下图: 硬边溶解原理 我们还记得之前讲应变溶解时的节点吗&…

如何快速一次性通过pmp考试?

我们就从三个方向进行了解 1.PMP考试难不难? 2.PMP如何备考? 3.考试过程中需要注意什么? 一,PMP考试难不难? 首先关注的问题是,PMP考试难吗?我想全球55%的通过率和学会这边93.9%的通过率&a…

架构基本概念和架构本质

什么是架构和架构本质 在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解。此君说的架构和彼君理解的架构未必是一回事。因此我们在讨论架构之前,我们先讨论架构的概念定义,概念是人认识这个世界的基础&…

宣布 Databricks 支持 Amazon Graviton2,性价比提高3倍

今天,我们很高兴地宣布 Databricks 对基于 Amazon Graviton2 的亚马逊弹性计算云(Amazon EC2)实例的支持的公开预览。Graviton 处理器由亚马逊云科技进行定制设计和优化,为运行在 Amazon EC2 上的云工作负载提供最佳性价比。当与高…

CSS字体样式(font)[详细]

CSS字体样式(font)1. font-family2. font-style3. font-weight4. font-size5. font-variant6. fontCSS 中提供了一系列用于设置文本字体样式的属性,比如更改字体,控制字体大小和粗细等等。font-family:设置字体&#x…

【LeetCode】剑指 Offer 12. 矩阵中的路径 p89 -- Java Version

题目链接:https://leetcode.cn/problems/ju-zhen-zhong-de-lu-jing-lcof/ 1. 题目介绍(12. 矩阵中的路径) 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则&…

配置Maven

对于刚开始认识的Maven的初学者超级有用的哦!项目统一共享使用一套jar包,由maven统一管理。节省了jar空间,统一jar包版本首先将maven安装完毕测试有没有配置完成,在命令框里面打 mvn -version进行测试maven安装完,第一…

Python 泛型 - 如何在实例方法中获取泛型参数T的类型?

先上解决方法:https://stackoverflow.com/questions/57706180/generict-base-class-how-to-get-type-of-t-from-within-instance 再来简单分析下源码。 talk is cheap, show me the code. from typing import Dict Dict[str, int]Dict只是一个类型,并不…

java数组基础详解

目录java数组基础详解一、引言二、声明数组三、初始化数组3.1 静态初始化3.2 动态初始化四、访问数组元素五、遍历数组六、分析数组内存七、数组常见异常7.1 索引越界异常ArrayIndexOutOfBoundsException7.2 空指针异常NullPointerExceptionjava数组基础详解 一、引言 数组定…

裸辞了,面试了几十家软件测试公司,终于找到想要的工作

上半年裁员,下半年裸辞,有不少人高呼裸辞后躺平真的好快乐!但也有很多人,裸辞后的生活五味杂陈。 面试了几十家终于找到心仪工作 因为工作压力大、领导PUA等各种原因,今年2月下旬我从一家互联网小厂裸辞,没…

【C语言进阶】结构体、位段、枚举、以及联合(共用体)的相关原理与使用

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:C语言进阶 🎯长路漫漫浩浩,万事皆有期待 文章目录1.结构体1.1 概述&a…

代码随想录【Day22】| 235. 二叉搜索树的最近公共祖先、701. 二叉搜索树中的插入操作、450. 删除二叉搜索树中的节点

235. 二叉搜索树的最近公共祖先 题目链接 题目描述: 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 …