并发多线程八股

并发多线程

  • 1.Java里面的线程和操作系统的线程一样吗?
  • 2.Java的线程安全在三个方面体现:
  • 3.保证数据一致性的方案
  • 4.线程创建的方式
    • 1)Thread类
    • 2)Runnable接口
    • 3)Callable接口和FutureTask
    • 4)线程池(executor框架)
  • 5.启动一个线程
  • 6.停止一个线程
  • 7.Java线程的状态有哪些
  • 8.sleep()和wait()的区别
  • 9.BLOCKED和WAITING的区别
  • 10.WAITING进入RUNNABLE的核心机制
  • 11.不同的线程之间如何通信
    • 1)修改共享变量
    • 2)等待通知机制
    • 3)同步辅助类
    • 4)计数信号量
  • 12.停止一个线程
  • 13.参考

1.Java里面的线程和操作系统的线程一样吗?

  • Java程序创建的线程和操作系统的线程是一对一的,java底层会调用pthread_create来创建线程。

2.Java的线程安全在三个方面体现:

  • 原子性:要么所有操作一起成功执行,要么一起失败回滚(atomic包,synchronized关键字)。
  • 可见性:保证线程对内存的修改可以及时被其他线程看见(synchronized关键字,volatile关键字)。
  • 有序性:指程序执行顺序符合预期,不会因为指令重排序后导致的乱序而出现错误(happens-before原则)。

3.保证数据一致性的方案

  • 事务管理ACID
  • 锁机制(synchronized、ReentrantLock)
  • CAS乐观锁

4.线程创建的方式

1)Thread类

  • 继承Thread类,重写run(。
  • 优点:编程简单,访问当前线程无需使用Thread.currentThread(), 直接使用this即可获取当前线程。
  • 缺点:继承了Thread类就不能继承其他父类。

2)Runnable接口

  • 实现Runnable接口,重写run(),然后将runnable对象作为参数传递给Thread类的构造器;
  • 优点:
    • 还可以继承其他类。
    • 多个线程共享同一个目标对象,适合多个相同线程来处理同一份资源的情况;
  • 缺点:编程稍复杂,访问当前对象需使用Thread.currentThread()方法。

3)Callable接口和FutureTask

  • Callable接口类相较于Runnable,其有call()方法可以有返回值并且可以抛出异常。执行callable任务,需将它包装进一个FutureTask,因为Thread类的构造器只接收Runnable参数,而FutureTask实现了Runnable接口。
  • 缺点:编程复杂,访问当前线程需调用Thread.currentThread()。
  • 优点:
    • 可以继承其他类。
    • 可以多个线程共享一个target对象,非常适合多线程处理同一份资源的情形。

4)线程池(executor框架)

  • 可以使用executors类的静态方法创建不同类型的线程池。
  • 缺点:线程池增加了程序的复杂度。
  • 优点:
    • 线程重用,降低资源消耗。
    • 提高响应速度,因为线程池的线程是预先创建好的。
    • 提高系统稳定性,因为线程池可以限制并发线程数量。
    • 支持任务队列存储待执行的任务,避免任务丢失。

5.启动一个线程

  • start(),线程会进入就绪状态。

6.停止一个线程

  • interrupt()修改中断状态标志位为true,run()中判断当前程序状态,中断状态就抛出InterruptedException异常。
  • stop(),已弃用,清理工作不到位。
  • return停止线程,interrupt()修改中断状态标志位为true后,run()中判断当前程序状态,中断状态就return。

7.Java线程的状态有哪些

  • 可以调用Thread中的getState()方法获取当前线程状态;
  • NEW:初始化状态;
  • RUNNABLE:就绪状态;
  • BLOCKED:阻塞状态,一般是获取锁的时候进行阻塞;
  • WAITING:无时限等待状态,一般是调用了wait()方法之后进行阻塞,正在等待另一个线程执行某些操作(如:notify());
  • TIME_WAITING:有时限等待状态,一般是调用了sleep()方法后进行阻塞;
  • TERMINATED:终止状态。

8.sleep()和wait()的区别

  • 分类不同,sleep()是Thread类的静态方法,wait()是Object类的实例方法,wait()必须通过对象来调用;
  • sleep()线程不会释放持有的对象锁,但会主动让出CPU时间片,时间结束自动进入就绪状态,wait()线程会释放持有的对象锁,直到被其他线程调用相同对象的notify()唤醒;
  • sleep()可以在任意位置调用,无需事先获取锁。Wait()必须在synchronized 代码块内调用,即要求线程需持有该对象的锁,否则抛出异常IllegalMonitorStateException

9.BLOCKED和WAITING的区别

  • BLOCKED是锁竞争失败后被动触发的状态;WAITING是人为的主动触发的状态。
  • BLOCKED的唤醒是其他线程释放锁后自动触发的,WAITING必须通过特定方法来主动唤醒。

10.WAITING进入RUNNABLE的核心机制

  • 外部事件触发
  • 资源可用性变化

11.不同的线程之间如何通信

1)修改共享变量

  • volatile关键字用于保证变量的可见性。当一个变量被声明为volatile时,它会保证该变量的写操作会立即刷新到主内存中,而读操作会从主内存中读取最新的值。

2)等待通知机制

  • Object类下的wait(),notify(),notifyAll();
  • LockSupport类下的park(),unpark()方法,唤醒指定线程;
  • Condition类下的await(),signal(),signalAll();
    • ReentrantLock是Lock接口的一个实现类,condition通过lock.newCondition()方法创建;
    • 可以创建多个等待集(存的是等待唤醒的对象),如:生产者、消费者,这样可以实现生产者消费者互相唤醒。
import java.util.concurrent.locks.Condition; 
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class LockConditionExample {private static final Lock lock = new ReentrantLock();private static final Condition condition = lock.newCondition();public static void main(String[] args) {......}
}

3)同步辅助类

4)计数信号量

12.停止一个线程

  • 通过共享标志位主动终止(volatile关键字);
  • 中断机制(Thread.interrupt());
  • 线程池的Future.cancel()停止线程(任务需通过线程池提交,且依赖中断机制);
  • 不可中断,则关闭资源。

13.参考

https://www.xiaolincoding.com/interview/juc.html#%E5%A4%9A%E7%BA%BF%E7%A8%8B

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

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

相关文章

VBA数据库解决方案第二十讲:SQL在VBA中几种常见的表达方式

《VBA数据库解决方案》教程(版权10090845)是我推出的第二套教程,目前已经是第二版修订了。这套教程定位于中级,是学完字典后的另一个专题讲解。数据库是数据处理的利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…

大语言模型智体的综述:方法论、应用和挑战(下)

25年3月来自北京大学、UIC、广东大亚湾大学、中科院计算机网络信息中心、新加坡南阳理工、UCLA、西雅图华盛顿大学、北京外经贸大学、乔治亚理工和腾讯优图的论文“Large Language Model Agent: A Survey on Methodology, Applications and Challenges”。 智体时代已经到来&a…

《STL 六大组件之容器篇:简单了解 list》

目录 一、list 简介二、list 的常用接口1. 构造函数(constructor )2. 迭代器(iterator)3. 容量、修改和访问(capacity 、modify and access) 一、list 简介 简单来说,list 就是数据结构初阶中学…

nmslib 是一个 超快、适用于高维向量的最近邻搜索库,基于 HNSW 算法,被广泛用于 语义搜索、推荐系统、人脸识别等任务

nmslib 是什么? nmslib(Non-Metric Space Library)是一个 高效的最近邻搜索(ANN, Approximate Nearest Neighbor Search) 库,专门用于 高维向量搜索,适用于 文本、图像、语音等嵌入向量 的相似…

前端流式输出实现详解:从原理到实践

前端流式输出实现详解:从原理到实践 前言一、流式输出核心原理1.1 什么是流式输出?1.2 技术优势对比1.3 关键技术支撑 二、原生JavaScript实现方案2.1 使用Fetch API流式处理关键点解析: 2.2 处理SSE(Server-Sent Events&#xff…

【STM32】最后一刷-江科大Flash闪存-学习笔记

FLASH简介 STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分,通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程,(系统存储器用于存储原厂写入的BootLoader程序,用于串口…

梯度(Gradient)与步长(Step Size)

梯度(Gradient)与步长(Step Size) 梯度与步长是优化算法(如梯度下降法)的核心概念。以下是它们的详细解释: 梯度(Gradient) ​定义 梯度是一个向量,表示多元…

freecad二开 xmlrpc接口api qtgui

FreeCAD.ConfigGet("UserAppData") 文件夹下创建mod文件夹 mod文件夹底下创建插件文件夹my_server: freecad_server.py: from xmlrpc.server import SimpleXMLRPCServer import FreeCADGui import FreeCADimport queue from PySide2.QtCore import QTi…

鸿蒙NEXT开发日志工具类(ArkTs)

import hilog from ohos.hilog; import { JSON } from kit.ArkTS; import { BusinessError } from kit.BasicServicesKit; import { StrUtil } from ./StrUtil;/*** 日志工具类* author: 鸿蒙布道师* since: 2024/03/31*/ export class LogUtil {private static logSize: numbe…

《Linux运维总结:基于银河麒麟V10+ARM64架构CPU源码编译部署单实例redis7.2.6》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、环境信息 环境信息如下: 主机IP 操作系统 Redis版本 CPU架构 192.168.1.111 K…

基于LSTM的文本分类1——模型搭建

源码 # coding: UTF-8 import torch import torch.nn as nn import torch.nn.functional as F import numpy as npclass Config(object):"""配置参数类,用于存储模型和训练的超参数"""def __init__(self, dataset, embedding):self.…

小了 60,500 倍,但更强;AI 的“深度诅咒”

作者:Ignacio de Gregorio 图片来自 Unsplash 的 Bahnijit Barman 几周前,我们看到 Anthropic 尝试训练 Claude 去通关宝可梦。模型是有点进展,但离真正通关还差得远。 但现在,一个独立的小团队用一个只有一千万参数的模型通关了…

nextjs使用02

并行路由 同一个页面,放多个路由,, 目录前面加,layout中可以当作插槽引入 import React from "react";function layout({children,notifications,user}:{children:React.ReactNode,notifications:React.ReactNode,user:React.Re…

github 无法在shell里链接

当我在shell端git push时,我发现总是22 timeout的问题。 我就进行了以下步骤的尝试并最终得到了解决。 第一步,我先确定我可以curl github,也就是我网络没问题 curl -v https://github.com 如果这个时候不超时和报错,说明网络…

当前主流的大模型知识库软件对比分析

以下是当前主流的大模型知识库软件对比分析,涵盖功能特性、适用场景及优劣势,结合最新技术动态和行业实践提供深度选型参考: 一、企业级智能知识库平台 1. 阿里云百炼(Model Studio) 核心能力:基于RAG技…

Java的比较器 Comparable 和 Comparator

在 Java 中,Comparable 和 Comparator 是用于对象排序的重要接口。它们提供了不同的排序方式,适用于不同的需求,同时在 Java 底层排序算法中发挥着关键作用。本文将从基础概念、使用方法、排序实现(包括升序、降序)、底…

基于Qlearning强化学习的太赫兹信道信号检测与识别matlab仿真

目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 太赫兹信道特性 2.2 Q-learning强化学习基础 2.3 基于Q-learning 的太赫兹信道信号检测与识别系统 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2024b仿真结果如下(完整代码运行后无水印…

力扣刷题————199.二叉树的右视图

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例 1: 输入:root [1,2,3,null,5,null,4] 输出:[1,3,4] 解题思路:我们可以想到这…

文件包含漏洞的小点总结

文件本地与远程包含: 文件包含有本地包含与远程包含的区别:本地包含只能包含服务器已经有的问题; 远程包含可以包含一切网络上的文件。 本地包含: ①无限制 感受一下使用phpstudy的文件上传,开启phpstudy的apache…

深度学习处理时间序列(5)

Keras中的循环层 上面的NumPy简单实现对应一个实际的Keras层—SimpleRNN层。不过,二者有一点小区别:SimpleRNN层能够像其他Keras层一样处理序列批量,而不是像NumPy示例中的那样只能处理单个序列。也就是说,它接收形状为(batch_si…