回炉重造java----JUC(第一天)

目录

  • JUC前置知识
  • ①进程和线程的区别?
  • ②并行和并发的区别?
  • ③异步调用和同步调用的区别?
  • ④创建线程的方法
  • ⑤线程的上下文切换
  • ⑥TimeUtil
  • ⑦Interrupt
  • ⑧如何在一个线程中终止另外一个线程?
  • ⑨线程的状态
  • 共享模型之管程
  •  阻塞式:Synchronized
  • 线程八锁问题
  • 变量的线程安全分析 
  • 常见的线程安全类
  • Monitor

JUC前置知识


①进程和线程的区别?

①其根本区别在于进程是操作系统资源分配的基本单位,而线程是CP任务调度和执行的基本单位。

②一个进程可以有多个线程,至少有一个,而一个线程只能属于一个进程。

③同一个线程里的进程共享资源,而进程之间的资源是相互独立的。

④开销方面,创建,切换或者销毁一个进程的开销明显大于线程的创建,切换和开销。

⑤通信方面,进程间通信相对复杂,一般是要通过网络进行通信,而线程之间因为是共享线程的资源,所以通信相对简单。

②并行和并发的区别?

①并发:当有多个线程在执行时,但是如果系统是单核CPU系统时,CPU在同一时刻只能执行一个线程,也叫作串行执行,但是CPU会通过时间片的方式进行线程之间的切换执行,一般把这种线程轮流使用CPU的方式叫做并发。

②并行:上面讲的是系统在单核CPU下的情况,但是如果系统是多核CPU时,在同一时刻会有多个线程被执行,线程之间互不干扰,这就叫做并行。

③异步调用和同步调用的区别?

        ①同步通常指的是事件、操作或进程之间的有序关系。在一个同步场景中,一个操作必须在另一个操作完成后才能开始执行。同步还可以指代多个线程或进程在执行过程中需要进行协调,例如通过锁、信号量等机制来确保数据一致性或避免竞争条件。

         ②异步描述的是事件、操作或进程之间相互独立的关系。在异步场景中,一个操作可以在不等待其他操作完成的情况下开始执行。异步操作使得多个任务可以独立进行,从而提高系统的并发性能和响应能力。

④创建线程的方法

        ①继承Thread类,重写Run方法

        ②实现Runnable接口,重写Run方法

        ③实现Callable接口,重写call方法

        ④线程池

⑤线程的上下文切换

注:sleep不释放锁,但是会让出CPU

⑥TimeUtil

public enum TimeUnit {/*** Time unit representing one thousandth of a microsecond*/NANOSECONDS {public long toNanos(long d)   { return d; }public long toMicros(long d)  { return d/(C1/C0); }public long toMillis(long d)  { return d/(C2/C0); }public long toSeconds(long d) { return d/(C3/C0); }public long toMinutes(long d) { return d/(C4/C0); }public long toHours(long d)   { return d/(C5/C0); }public long toDays(long d)    { return d/(C6/C0); }public long convert(long d, TimeUnit u) { return u.toNanos(d); }int excessNanos(long d, long m) { return (int)(d - (m*C2)); }},/*** Time unit representing one thousandth of a millisecond*/MICROSECONDS {public long toNanos(long d)   { return x(d, C1/C0, MAX/(C1/C0)); }public long toMicros(long d)  { return d; }public long toMillis(long d)  { return d/(C2/C1); }public long toSeconds(long d) { return d/(C3/C1); }public long toMinutes(long d) { return d/(C4/C1); }public long toHours(long d)   { return d/(C5/C1); }public long toDays(long d)    { return d/(C6/C1); }public long convert(long d, TimeUnit u) { return u.toMicros(d); }int excessNanos(long d, long m) { return (int)((d*C1) - (m*C2)); }},/*** Time unit representing one thousandth of a second*/MILLISECONDS {public long toNanos(long d)   { return x(d, C2/C0, MAX/(C2/C0)); }public long toMicros(long d)  { return x(d, C2/C1, MAX/(C2/C1)); }public long toMillis(long d)  { return d; }public long toSeconds(long d) { return d/(C3/C2); }public long toMinutes(long d) { return d/(C4/C2); }public long toHours(long d)   { return d/(C5/C2); }public long toDays(long d)    { return d/(C6/C2); }public long convert(long d, TimeUnit u) { return u.toMillis(d); }int excessNanos(long d, long m) { return 0; }},/*** Time unit representing one second*/SECONDS {public long toNanos(long d)   { return x(d, C3/C0, MAX/(C3/C0)); }public long toMicros(long d)  { return x(d, C3/C1, MAX/(C3/C1)); }public long toMillis(long d)  { return x(d, C3/C2, MAX/(C3/C2)); }public long toSeconds(long d) { return d; }public long toMinutes(long d) { return d/(C4/C3); }public long toHours(long d)   { return d/(C5/C3); }public long toDays(long d)    { return d/(C6/C3); }public long convert(long d, TimeUnit u) { return u.toSeconds(d); }int excessNanos(long d, long m) { return 0; }},/*** Time unit representing sixty seconds*/MINUTES {public long toNanos(long d)   { return x(d, C4/C0, MAX/(C4/C0)); }public long toMicros(long d)  { return x(d, C4/C1, MAX/(C4/C1)); }public long toMillis(long d)  { return x(d, C4/C2, MAX/(C4/C2)); }public long toSeconds(long d) { return x(d, C4/C3, MAX/(C4/C3)); }public long toMinutes(long d) { return d; }public long toHours(long d)   { return d/(C5/C4); }public long toDays(long d)    { return d/(C6/C4); }public long convert(long d, TimeUnit u) { return u.toMinutes(d); }int excessNanos(long d, long m) { return 0; }},/*** Time unit representing sixty minutes*/HOURS {public long toNanos(long d)   { return x(d, C5/C0, MAX/(C5/C0)); }public long toMicros(long d)  { return x(d, C5/C1, MAX/(C5/C1)); }public long toMillis(long d)  { return x(d, C5/C2, MAX/(C5/C2)); }public long toSeconds(long d) { return x(d, C5/C3, MAX/(C5/C3)); }public long toMinutes(long d) { return x(d, C5/C4, MAX/(C5/C4)); }public long toHours(long d)   { return d; }public long toDays(long d)    { return d/(C6/C5); }public long convert(long d, TimeUnit u) { return u.toHours(d); }int excessNanos(long d, long m) { return 0; }},/*** Time unit representing twenty four hours*/DAYS {public long toNanos(long d)   { return x(d, C6/C0, MAX/(C6/C0)); }public long toMicros(long d)  { return x(d, C6/C1, MAX/(C6/C1)); }public long toMillis(long d)  { return x(d, C6/C2, MAX/(C6/C2)); }public long toSeconds(long d) { return x(d, C6/C3, MAX/(C6/C3)); }public long toMinutes(long d) { return x(d, C6/C4, MAX/(C6/C4)); }public long toHours(long d)   { return x(d, C6/C5, MAX/(C6/C5)); }public long toDays(long d)    { return d; }public long convert(long d, TimeUnit u) { return u.toDays(d); }int excessNanos(long d, long m) { return 0; }};

Thread中sleep的技巧:

        Thread.sleep(500);//默认是毫秒TimeUnit.MILLISECONDS.sleep(500);

sleep的技巧:

⑦Interrupt

         如果是打断sleep或者wait或者join的线程,Isinterrupt()返回的结果依旧是FALSE,但是会通过抛出异常的方式回应。

        如果是打断正在运行的进程,Isinterrupt()返回的结果就是TRUE。但是只是设置这个标记,不会真正的直接停掉线程。

⑧如何在一个线程中终止另外一个线程?

 

⑨线程的状态

        ①New:新建状态。

        ②Runnable:可运行状态(其包含了可运行,正在运行和IO阻塞)。

        ③Blocked:阻塞状态(像拿不到锁阻塞等待)。

        ④Waiting:等待状态,一般要使用notify或者notifyAll方法唤醒。

        ⑤Timed_Waiting:超时等待状态。

        ⑥Terminated:终止状态。所以当你第二次调用start方法的时候就会报错。

共享模型之管程

并发:原子性,可见性和有序性

 阻塞式:Synchronized

实际上是使用对象锁保证了临界区内代码的原子性。 

public class syntest {private static Object object = new Object();private static int num=0;public static void main(String[] args) throws InterruptedException {//创建一个线程Thread t1 = new Thread(() -> {for (int i = 0; i < 10; i++) {synchronized (object){System.out.println("线程一获得了锁");num++;}}}, "t1");//创建一个线程Thread t2 = new Thread(() -> {for (int i = 0; i < 10; i++) {synchronized (object){System.out.println("线程二获得了锁");num--;}}}, "t2");t1.start();t2.start();t1.join();t2.join();System.out.println(num);}
}

synchronize可以锁对象,也可以锁成员方法(锁的是this对象),还可以锁静态方法(锁的是该类)

线程八锁问题

情况一:锁对象 

情况二:sleep不释放锁

 情况三:添加一个无锁的普通方法,并行执行普通方法

情况四:成员方法上锁的是this对象

情况五:静态方法上锁的是class,与锁this对象时两个不同的对象,不会互斥

情况六:静态方法上锁的是class

情况七:静态方法上锁的是class,与锁this对象时两个不同的对象,不会互斥

 情况八:锁的都是class类对象

变量的线程安全分析 

①成员变量和静态变量都是线程不安全的

②局部变量是线程安全。但是如果局部变量有引用的话而且暴露给了外部(即创建的子类中创建一个线程去操作引用),就是不安全的。

常见的线程安全类

①String,被final修饰,并且为不可变类

②包装类Integer,Boolean,Dobue.....,也是被final修饰,并且为不可变类

③StringBuffer,也是被final修饰

④集合中的vector和hashtable

⑤java.util.concurrent包下的类

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

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

相关文章

LLVM后端__llc中值定义信息的查询方法示例

关于LiveIntervals pass中相关数据结构的含义&#xff0c;在寄存器分配前置分析(5.1) - LiveInterval这篇博客中已经做了清晰的讲解&#xff0c;此处不再赘述&#xff0c;本文主要讲解值定义信息VNInfo的使用方法和注意事项。 1. VNInfo含义 在LLVM的源码中&#xff0c;VNInf…

视频汇聚EasyCVR综合安防平台对接GA/T1400公安视图库及应用方案

随着科技的不断进步&#xff0c;视频监控系统在公共安全领域发挥着越来越重要的作用。GA/T1400公安视图库作为公安视频图像信息应用系统的标准&#xff0c;为视频监控系统的对接提供了统一的规范和技术要求。 GA/T1400标准的应用范围广泛&#xff0c;涵盖了公安系统的视频图像信…

图解大模型分布式并行各种通信原语

背景 在分布式集群上执行大模型任务时候&#xff0c;往往使用到数据并行&#xff0c;流水线并行&#xff0c;张量并行等技术&#xff0c;这些技术本质上也就是对数据进行各种方案的切分&#xff0c;然后放到不同的节点上运算。不同节点在计算的过程中需要对数据分发或者同步等…

【精读文献】J. Environ. Manage.|青藏高原生态恢复项目下植被覆盖动态及其对生态系统服务的约束效应

目录 文章简介 01 文章摘要 02 研究背景、目标及创新点 2.1 研究背景 2.2 研究现状 03 研究区域与数据集 3.1 研究区域 3.2 研究数据 04 研究方法 4.1 趋势分析 4.2 残差趋势分析 4.3 偏相关 4.4 生态系统服务评价 4.5 约束线的定义和提取 05 研究结果 5.1 植被…

秒杀基本功能开发(不考虑高并发情况)

文章目录 1.显示秒杀状态1.controller修改GoodsController.java的toDetail方法&#xff0c;响应秒杀状态和秒杀剩余时间 2.前端1.goodsDetail.html 图片下面添加一行秒杀开始时间2.goodsDetail.html 添加计时器js代码 3.测试1.秒杀进行中2.修改db的秒杀开始时间为明天3.出现秒杀…

<Rust><iced>基于rust使用iced库构建GUI实例:动态改变主题色

前言 本专栏是Rust实例应用。 环境配置 平台&#xff1a;windows 软件&#xff1a;vscode 语言&#xff1a;rust 库&#xff1a;iced、iced_aw 概述 本篇构建了这样的一个实例&#xff0c;可以动态修改UI的主题&#xff0c;通过菜单栏来选择预设的自定义主题和官方主题&#…

python列表的扩展操作

列表的扩展操作 zip() 函数 我们先学习 zip() 函数&#xff0c;将排名与分数挂钩。 还记得期中考试的顺序排名和分数吗&#xff1f;我们把排名放在了列表 midterm_rank 中&#xff0c;把分数放在了 scores 中。不过当时 scores 并没有排序&#xff0c;我们要对数据进行预处理…

深入理解文件系统和日志分析

文件是存储在硬盘上的&#xff0c;硬盘上的最小存储单位是扇区&#xff0c;每个扇区的大小是512字节。 inode&#xff1a;存储元信息&#xff08;包括文件的属性&#xff0c;权限&#xff0c;创建者&#xff0c;创建日期等等&#xff09; block&#xff1a;块&#xff0c;连续…

小白跟做江科大32单片机之LED闪烁

原理介绍 原理介绍详见&#xff1a; 【STM32】江科大STM32学习笔记汇总(已完结)_stm32江科大笔记-CSDN博客https://blog.csdn.net/u010249597/article/details/134762513 项目准备 1.在项目文件夹中新建3-1 LED文件夹 2.keil新建项目&#xff0c;打开新建的3-1 LED&#xf…

【CC2530-操作外部flash】

zigbee cc2530操作flash&#xff0c;以cc2530读flash_id为例子&#xff1b; void InitIO() {CLKCONCMD & ~0x40; //设置系统时钟源为32MHZ晶振 while(CLKCONSTA & 0x40); //等待晶振稳定为32M CLKCONCMD & ~0x47; //设置系统主时钟频率为32MHZ…

面试(五)

目录 1. 知道大顶堆小顶端吗&#xff0c;代码怎么区分大顶端小顶端 2. 计算机中栈地址与内存地址增长方向相反吗&#xff1f; 3. %p和%d输出指针地址 4. 为什么定义第二个变量时候&#xff0c;地址反而减了 5. 12&#xff0c;32&#xff0c;64位中数据的占字节&#xff1f;…

物质的量质量,它们可不是一个概念

物质的量&质量&#xff0c;它们可不是一个概念。 物质的量&质量 乍一听物质的量&#xff0c;还以为是和质量有什么关系&#xff0c;是不是&#xff1f;其实物质的量和质量没什么直接的联系。 物质的量是国际单位制中7个基本物理量之一&#xff0c;其符号为n&#xf…

Aras Innovator-Team(群组)的使用方法

当Aras Innovator在处理权限时&#xff0c;在不使用Team的情况下&#xff0c;系统的权限配置可以满足大部分业务场景&#xff0c;如&#xff1a;常见的按照组织架构&#xff0c;成员和角色分配权限&#xff0c;按照生命周期分配权限等。 如果遇到比较复杂的权限需求&#xff0c…

AltiumDesigner/AD添加数据库连接

1.首先确保本机电脑有无对应的数据库驱动&#xff0c;例如我这边要添加MySQL的数据&#xff0c;则需要首先下载MySQL数据驱动&#xff1a;MySQL :: Download MySQL Connector/ODBC (Archived Versions) 2.运行“odbcad32.exe”&#xff0c;如下图添加对应的数据库配置&#xf…

【C/C++】C/C++车辆交通违章管理系统(源码+数据文件)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

面试题:useEffect的Clean Up 什么时候触发?

​ useEffect作为做常用的Hook&#xff0c;以下三个知识点你有必要了解下~ 防止写出奇怪的代码祸害队友&#xff0c;而我不幸就是这个受害者&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; useEffect的依赖项为空 useEffect的dependencyList作为一个可选参数…

Pytest框架中用例用例执行常用参数介绍

pytest 支持通过命令行参数来定制测试运行的方式。以下是一些常用的 pytest 执行参数介绍。 学习目录 -q 或 --quiet: 安静模式&#xff0c;只显示进度和摘要 -s : 选项允许在测试的输出中捕获 stdout 和 stderr。 -v : 选项会使 pytest 的输出更加详细。 -k &#xff1a;…

Git 恢复已删除的branch

六一节晚上改了点code, 做完之后commit, 然后误删了这个branch, 并且新建了branch. 那么怎样恢复已删除的branch呢&#xff1f; 网上查询一番&#xff0c;找到了答案&#xff1a; 1. git reflog 找到被删的branch中最后一笔commit, 记录它的SHA1。 怎么看SHA1是被删除的bra…

鸿蒙应用Stage模型【应用/组件级配置】

应用/组件级配置 在开发应用时&#xff0c;需要配置应用的一些标签&#xff0c;例如应用的包名、图标等标识特征的属性。本文描述了在开发应用需要配置的一些关键标签。 应用包名配置 应用需要在工程的AppScope目录下的[app.json5配置文件]中配置bundleName标签&#xff0c;…

Python PyInstaller打包方法介绍

为了将开发好的Python工具交付给其他人使用&#xff0c;除了在目标电脑部署Python编译环境以外&#xff0c;我们还可以将它打包成可执行文件&#xff0c;这样目标电脑不需要安装Python环境就可以运行。将Python程序打包成可执行文件的方法有多种&#xff0c;比如Nuitka、PyInst…