首页 > 编程语言 >Java并发编程(八)

Java并发编程(八)

时间:2024-08-22 17:52:41浏览次数:15  
标签:执行权 Java 队列 编程 并发 线程 等待 CPU wait

1、volatile 有什么用?能否用一句话说明下 volatile 的应用场景

volatile 保证内存可见性和禁止指令重排。

volatile 用于多线程环境下的单次操作(单次读或者单次写)。

2、为什么代码会重排序

在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重排序,但是不能随意重排序,不是你想怎么排序就怎么排序,它需要满足以下两个条件:

  • 在单线程环境下不能改变程序运行的结果
  • 存在数据依赖关系的不允许重排序

需要注意的是:重排序不会影响单线程环境的执行结果,但是会破坏多线程的执行语义

3、在 java 中 wait 和 sleep 方法的不同

最大的不同是在等待时 wait 会释放锁,而 sleep 一直持有锁。Wait 通常被用于线程间交互,sleep 通常被用于暂停执行。

直接了解的深入一点吧:

在 Java 中线程的状态一共被分成 6 种

初始态:NEW

创建一个 Thread 对象,但还未调用 start()启动线程时,线程处于初始态。

运行态:RUNNABLE

在 Java 中,运行态包括就绪态 和 运行态。

  • 就绪态 该状态下的线程已经获得执行所需的所有资源,只要 CPU 分配执行权就能运行。所有就绪态的线程存放在就绪队列中。
  • 运行态 获得 CPU 执行权,正在执行的线程。由于一个 CPU 同一时刻只能执行一条线程,因此每个 CPU 每个时刻只有一条运行态的线程。

阻塞态

当一条正在执行的线程请求某一资源失败时,就会进入阻塞态。而在 Java 中,阻塞态专指请求锁失败时进入的状态。由一个阻塞队列存放所有阻塞态的线程。处于阻塞态的线程会不断请求资源,一旦请求成功,就会进入就绪队列,等待执行。

PS:锁、IO、Socket 等都资源。

等待态

当前线程中调用 wait、join、park 函数时,当前线程就会进入等待态。也有一个等待队列存放所有等待态的线程。线程处于等待态表示它需要等待其他线程的指示才能继续运行。进入等待态的线程会释放 CPU 执行权,并释放资源(如:锁)

超时等待态

当运行中的线程调用 sleep(time)、wait、join、parkNanos、parkUntil 时,就会进入该状态;它和等待态一样,并不是因为请求不到资源,而是主动进入,并且进入后需要其他线程唤醒;进入该状态后释放 CPU 执行权 和 占有的资源。与等待态的区别:到了超时时间后自动进入阻塞队列,开始竞争锁。

终止态

线程执行结束后的状态。

注意:

wait()方法会释放 CPU 执行权 和 占有的锁。

sleep(long)方法仅释放 CPU 使用权,锁仍然占用;线程被放入超时等待队列,与yield 相比,它会使线程较长时间得不到运行。

yield()方法仅释放 CPU 执行权,锁仍然占用,线程会被放入就绪队列,会在短时间内再次执行。

wait 和 notify 必须配套使用,即必须使用同一把锁调用;

wait 和 notify 必须放在一个同步块中调用 wait 和 notify 的对象必须是他们所处同步块的锁对象。

4、一个线程运行时发生异常会怎样

如果异常没有被捕获该线程将会停止执行。Thread.UncaughtExceptionHandler是用于处理未捕获异常造成线程突然中断情况的一个内嵌接口。当一个未捕获异常将造成线程中断的时候 JVM 会使用 Thread.getUncaughtExceptionHandler()来查询线程的 UncaughtExceptionHandler 并将线程和异常作为参数传递给handler 的 uncaughtException()方法进行处理

5、如何在两个线程间共享数据

在两个线程间共享变量即可实现共享。

一般来说,共享变量要求变量本身是线程安全的,然后在线程内使用的时候,如果有对共享变量的复合操作,那么也得保证复合操作的线程安全性。

标签:执行权,Java,队列,编程,并发,线程,等待,CPU,wait
From: https://blog.csdn.net/qq_38811830/article/details/141367489

相关文章

  • Java 字符串转换成罗马数字
    键盘录入一个字符串要求1:长度为小于等于9要求2:只能是数字将内容变成罗马数字下面是阿拉伯数字跟罗马数字的对比关系Ⅰ-1,Ⅱ-2,Ⅲ-3,Ⅳ-4,Ⅴ-5,Ⅵ-6,Ⅶ-7,Ⅷ-8,Ⅸ-9注意点:罗马数字里面是没有0的如果键盘录入的数字包含0,可以变成""(长度为0的字符串)packagetest;......
  • Java的循环结构
     一、什么是循环语句在Java中,循环是一种控制结构,允许程序重复执行一段代码块,直到满足特定的条件为止。循环结构在编程中非常重要,因为它可以避免重复编写相同的代码,提高代码的效率和可读性。一、循环条件这是一个判断表达式,用于确定是否继续执行循环。只要循环条件为真,循......
  • 什么是JAVA
    Java发展史机器语言:电子机器能够直接识别的语言,无需经过翻译,计算机内部就有相应的电路来完成它;从使用的角度来看,机器语言是最低级的语言。高级语言:更容易被人们所理解的高级程序语言,符合人类思维模式的程序设计语言,如:C、Java,JavaScript、Python、Go等。汇编语言:面向机器......
  • Java基础--static关键字
    引言        在Java编程中,static关键字是一个非常重要的概念。它可以用于变量、方法、代码块。提供了在内存管理和代码结构上的独特优势,理解并正确使用static关键字是掌握Java编程的重要一步。static关键字是什么?    static关键字是Java中的一个修饰符,用于......
  • jenkins 自动安装 和 手动安装java 或者一些其他环境配置的区别
    由于之前的jenkins存在安全漏洞,升级了jenkins,相应的jenkinsmaster服务器上的javajdk也一起升级为openjdk21.升级后发现:1.新的jenkins的slavenode启动的jar包下载后,在原来的slavenode服务器上面无法正常被执行了。这时我才知道原来升级了jenkins,对应的slavenode启动的jar......
  • Java中什么是反射
    反射文章目录反射反射概述反射是什么反射的作用反射的使用获取Class生成实例对象访问属性调用方法反射的应用反射封装JDBC框架传统写法:封装AddOne方法封装find方法封装updateById方法封装deleteById方法Guava自定义注解反射概述反射是什么反射(Reflection)......
  • Java之日期
    目录日期java.time的API(目前多用time)一、LocalDate1.基本用法2.日期之间的转化3.LocalDateTime计算4.格式化日期二、Instant1.基本应用2.常见方法3.时间计算4.时间转化三、DateTimeFormatter时间格式化1.基本用法2.各类时间格式化四、ZonedDateTime1.基本用法2.Zo......
  • java+vue计算机毕设旅游景点预约系统【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着旅游业的蓬勃发展,人们对旅游体验的需求日益个性化与高效化。传统的旅游预订方式往往存在信息不对称、购票流程繁琐、景点拥堵等问题,影响了游客的......
  • java+vue计算机毕设开放实验室网上预约系统【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着高等教育体系的不断发展和教育资源的日益丰富,实验室作为培养学生实践能力和创新精神的重要场所,其使用效率与管理水平成为衡量高校教学质量的重要......
  • java+vue计算机毕设农资电子监管系统的设计与实现【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着农业现代化的不断推进,农资产品的流通与管理成为保障农业生产高效、安全的重要环节。传统农资管理模式存在信息不对称、监管难度大、效率低下等问......