当前位置: 首页 > ai >正文

Java应届生求职八股(5)---并发编程篇

线程基础

线程与进程的区别

  • 进程是程序的一次执行过程。它资源分配的单位
  • 线程程序执行的单位

并行和并发的区别

  • 单核CPU下,线程串行。(并发:多线程轮流使用一个或多个CPU)
  • 多核CPU下,每个核都可调度线程。(并行:多CPU同时执行多个线程。

创建线程的方式

  1. 继承Thread类
  2. 实现Runnable接口
  3. 实现Callable接口
  4. 线程池创建线程
runnable和callable的区别
  • Runnable接口run方法没有返回值;Callable接口call方法返回值
  • Runnable接口run方法的异常只能内部消化不能上抛;Callable接口call方法允许抛出异常
线程的run()和start()的区别
  • start():用于启动线程能被调用一次
  • run():封装要被线程执行的代码,可以被调用多次
wait()和sleep()方法的区别

1.方法归属不同

  • sleep() 是Thread类的静态方法
  • wait() 是Object类的成员方法,任何对象都有

2.唤醒时机不同

  • 执行 sleep() 的线程会在等待相应毫秒后唤醒
  • wait() 可以被 notify() 唤醒

3.锁特性不同

  • wait()方法的调用必须先获取对象的;sleep()不需要
  • wait()执行完会释放对象锁;sleep()若在synchronized中执行,不释放对象锁

线程的状态与转换条件

三个线程如何顺序执行

使用线程中的join()方法解决。

t.join():等待线程运行结束。阻塞调用此方法的线程,直到t线程执行完成。

    并发安全

    Synchronized

    实现原理

    基于进入和退出Monitor对象来实现方法同步和代码块同步。

    • 方法级的同步是隐式,JVM可以通过 ACC_SYNCHRONIZED 访问标志区分一个方法是否同步方法。
    • 代码块的同步是利用monitorentermonitorexit这两个字节码指令。

    底层实现

    synchronized的底层实现是依赖于Java对象头,以及Monitor对象监视器。

    Monitor监视器锁有三个重要属性:_Owner _WaitSet _EntryList

    • _owner指向持有ObjectMonitor对象的线程。
    • 当多个线程同时访问时,首先会进入 _EntryList 集合等待。
    • 当线程获取到对象的monitor 后,把monitor中的owner变量设置为当前线程,同时monitor中的计数器count加1。
    • 若线程调用 wait() 方法,将释放当前持有的monitor,owner变量恢复为null,count自减1,同时该线程进入 _WaitSet集合中等待被唤醒。

    Monitor实现的锁属于重量级锁,于是有了锁升级,基于对象头(MarkWord)

    • 最轻程度的锁为偏向锁,资源总是由同一线程多次获得。偏向锁只依赖于锁对象,锁对象在64位虚拟机里由64Bit的Markword来控制,线程获取锁时,通过CAS方式将线程ID设置到对象头里的MarkWord的Thread ID中,线程ID指针在MarkWord中占用54个比特位偏向锁的标识位为101
    • 当对象进行了hash操作,那么锁就会失效,因为HashCode在MarkWord中占用31个比特位无锁的表示位为001
    • 接着被另外的线程所访问,偏向锁升级为轻量级锁,MarkWord中指向线程栈的lock record指针。其他线程会自旋尝试获取锁,不会阻塞。轻量级锁的标识位为000
    • 一旦线程竞争,升级为重量级锁,其他线程都会被阻塞重量级锁的标识位为010

    http://www.xdnf.cn/news/17945.html

    相关文章:

  • 【OpenGL】LearnOpenGL学习笔记10 - 平行光、点光源、聚光灯
  • ZCU国产化方案选型,哪家物料更齐全
  • 图像相似度算法汇总及Python实现
  • Linux内核内存管理深度解析
  • 自适应阈值二值化参数详解 ,计算机视觉,图片处理 邻域大小 调整常数(C=3)和可视化调节参数的应用程序
  • [Linux] Linux硬盘分区管理
  • 配置 Docker 镜像加速,解决 docker pull 拉取镜像失败、docker search 查询镜像失败等问题
  • 数据库Microsoft Access、SQL Server和SQLite三者对比及数据库的选型建议
  • Win11和Win10共享打印机提示709用添加Windows凭据来解决的小方法
  • 【UHD】vivado 2021.1 编译
  • 接口自动化测试框架搭建
  • maven与maven-archetype-plugin版本匹配问题
  • 一周学会Matplotlib3 Python 数据可视化-绘制绘制甘特图
  • 跑实验记录
  • Python Day30 CSS 定位与弹性盒子详解
  • python---内置函数
  • 微服务之注册中心与ShardingSphere关于分库分表的那些事
  • 【手撕JAVA多线程】1.从设计初衷去看JAVA的线程操作
  • Camera相机人脸识别系列专题分析之十九:MTK ISP6S平台FDNode原生代码
  • 【自动化运维神器Ansible】Ansible比较操作符详解:从基础到实战应用
  • 笔试——Day40
  • AI生成视频开源模型技术解析
  • 算法题打卡力扣第42题接雨水(hard)
  • OpenJDK 17的C1和C2编译器实现中,方法返回前插入安全点(Safepoint Poll)的机制
  • 拒绝造轮子(C#篇)ZLG CAN卡驱动封装应用
  • 贺雨禾《梨花往事》北京首映,“野草型演员”深耕走出新赛道
  • 第4问 常见的指标有哪些?
  • 【CVPR2025】计算机视觉|GIFNet:一个模型实现所有图像融合任务!还能增强画质?!
  • [1Prompt1Story] 滑动窗口机制 | 图像生成管线 | VAE变分自编码器 | UNet去噪神经网络
  • 【Qt开发】常用控件(四)