码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Java面试题之并发


    并发

      • 1.并发编程的优缺点?
      • 2.并发编程三要素?
      • 3.什么叫指令重排?
      • 4.如何避免指令重排?
      • 5.并发?并行?串行?
      • 6.线程和进程的概念和区别?
      • 7.什么是上下文切换?
      • 8.守护线程和用户线程的定义?
      • 9.什么是线程死锁?
      • 10.形成死锁的四个条件?
      • 11.怎么避免死锁?
      • 12.创建线程的四种方式?
      • 13.runable和callable区别?
      • 14.run()和start()的区别?
      • 15.什么是futureTask?
      • 16.为什么我们调用start()方法会执行run()方法,为什么我们不能直接调用run()方法?
      • 17.线程生命周期及五种状态的转换?
      • 18.线程调度的几种模型?
      • 19.线程调度策略?
      • 20.什么是线程调度器和时间分片?
      • 21.wait、sleep、yield区别?notify、notifyAll区别?
      • 22.sleep、yield为什么是静态的?
      • 23.如何调用wait()?使用if块还是循环块?
      • 24.为什么线程通信方法wait()、notify()、notifyAll()定义在Object中?
      • 25.为什么wait()、notify()、notifyAll()必须在同步方法或者同步块中被调用?
      • 26.如何停止一个正在运行的线程?
      • 27.interrupt、interrupted和isInterrupt方法的区别?
      • 28.怎么唤醒阻塞线程?
      • 29.什么是阻塞式方法?
      • 30.实现线程同步的方法?
      • 31.同步方法和同步块是什么?
      • 32.线程池的工作原理?
      • 33.创建线程池都有哪些方式?
      • 34.线程池常用的几个参数?
      • 35.线程池的拒绝策略有哪些?
      • 36.线程池都有哪些状态?
      • 37.线程池中submit()和execute()的区别?
      • 38.当你提交任务时,线程池队列已满,这时会发生什么?
      • 39.synchronized使用方式?
      • 40.synchronized的锁升级的过程
      • 41.synchronized底层原理?
      • 42.什么是自旋?
      • 43.synchronized可重入的原理?
      • 44.synchronized和volicate区别?
      • 45.Lock和synchronized区别?(面试问过)
      • 46.synchronized和ReentrantLock可重入锁的区别?
      • 47. ReentrantLock是什么?
      • 48.synchronized为什么不能集群操作?如果想集群操作用什么?
      • 49.线程池用完扔回线程池是什么状态?
      • 50.CAS和ABA的问题?
      • 51.线程池的线程数是怎么确定的?
      • 52.ThredLocal是什么?以及使用场景?
      • 53.什么是临界区?
      • 53.ab同时提交线程完成任何一个就去执行C,用什么来完成?
      • 54.ab同时提交线程,需要判断结果,就去执行C,用什么来完成?
      • 55.CountDownLatch是什么?
      • 56.ExecutorService是什么?
      • 55.AQS简单介绍一下?(面试)
      • 55.CLH是什么?
      • 55.什么是可重入锁?
      • 55.怎么理解线程安全?
      • 55.线程池的应用场景?
      • 54.为什么要使用并发编程?
      • 55.双重校验锁实现对象单例模式?
      • 56.多线程的应用场景?

    1.并发编程的优缺点?

    优点:

    • 充分利用多核CPU的计算能力,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升;
    • 方便业务拆分,提升系统并发能力和性能;

    缺点:

    • 内存泄漏;
    • 线程安全问题;
    • 复杂程度增加:比如死锁;
    • 资源消耗增加:比如频繁的上下文切换也可能导致额外的性能开销;

    2.并发编程三要素?

    • 原子性:原子,就是一个不可再被分割的颗粒。原子性就是指一个或多个操作要么全部执行成功要么全部执行失败;
    • 可见性:一个线程对共享变量的修改,另一个线程能够立刻看到;
    • 有序性:程序执行的顺序按照代码先后顺序执行。(处理器可能会对指令进行重排序)

    3.什么叫指令重排?

    指令重排(也称为指令重排序)是指在程序执行过程中,指令的执行顺序可能与它们在代码中的顺序不一致的现象。编译器和处理器为了提高程序的执行效率,可能会根据一些规则和优化策略对指令进行重新排序。但是,这种重排序必须保证最终的执行结果与不进行重排时的执行结果保持一致,以确保程序的正确性;存在数据依赖关系的也不允许指令重排

    指令重排主要是基于处理器的特性,如多级缓存、多核等,来优化指令的执行顺序。这种优化可以使程序在保证业务运行的同时,充分利用CPU的资源,发挥最大的性能。然而,指令重排也可能会导致线程安全问题,特别是在多线程环境下。因此,在编写并发程序时,需要特别注意指令重排的影响,并采取相应的措施来确保程序的正确性和性能。

    4.如何避免指令重排?

    • 使用volatile关键字:在Java中,volatile关键字可以确保多线程环境下变量的可见性和有序性。当一个变量被声明为volatile时,它会禁止指令重排,确保所有线程看到的变量值都是一致的。volatile关键字还可以防止JVM的指令重排优化,确保代码的执行顺序与预期一致。
    • 使用synchronized关键字:synchronized关键字可以用来保证代码块或方法的原子性,即在同一时刻只能有一个线程执行被保护的代码。通过synchronized块或方法,可以确保指令按照预期的顺序执行,避免指令重排导致的线程安全问题。
    • 使用Lock接口及其实现类:Java中的Lock接口及其实现类(如ReentrantLock)也可以用来控制并发访问,保证代码的正确执行顺序。与synchronized相比,Lock接口提供了更灵活的控制方式,可以更好地避免指令重排带来的问题。
    • 避免使用final关键字修饰引用类型变量:在Java中,final关键字修饰的引用类型变量在初始化后不能被改变。但是,如果final变量指向的对象是可变的,那么其他线程仍然可以修改该对象的内容。因此,在使用final关键字时,需要特别注意避免指令重排导致的线程安全问题。
    • 了解并遵循Happens-Before规则:Happens-Before规则是Java内存模型定义的一组规则,用于确定多线程环境中哪些操作是有序的。遵循这些规则可以确保指令按照预期的顺序执行,避免指令重排导致的线程安全问题。

    5.并发?并行?串行?

    • 并发:多个任务在同一个cpu上,按细分的时间片轮流执行,从逻辑上来看那些任务是同事执行的;(两个队列一台咖啡机)
    • 并行:单位时间内,多个处理器或多核处理器同时处理多个任务,是真正意义上的同时进行;(两个队列一两台咖啡机)
    • 串行:有n个任务,由一个线程按顺序执行,犹豫任务,方法都在一个线程执行,所以不存在线程不安全情况,也就不存在临界区的问题;(一个队列一台咖啡机)

    6.线程和进程的概念和区别?

    进程:是操作系统资源分配的基本单位,一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程可以有多个线程。
    线程:处理器任务调度和执行的基本单位,又叫做轻型进程;进程中的一个执行任务,负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据;

    区别:

    • 资源开销:进程是系统分配资源的基本单位,它
  • 相关阅读:
    Centos 7配置开机自启Springboot项目
    【Mysql】Mysql内置函数介绍
    C#界面实时显示当前时间 定时器
    Java之Collections的综合小练习
    Java数学工具类Math的Math.round()方法
    面经自己汇总(三维视觉算法)——持续更新
    docker 部署 MongoDB
    【Linux】-- 开发工具yum、vim、gcc、g++、gdb、make、makefile使用介绍
    【计组笔记】06_指令系统
    如何缓解失业无收入焦虑状态?
  • 原文地址:https://blog.csdn.net/HC_MM/article/details/136342774
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号