首页 > 编程语言 >并发编程面试1

并发编程面试1

时间:2024-07-05 18:30:18浏览次数:23  
标签:缓存 协程 面试 编程 并发 ThreadLocal 线程 内存 CPU

一、进程,线程,协程的区别

1、进程: 操作系统进行资源分配和调度的基本单位。每个进程有独立的内存空间。进程通讯就采用 共享内存,MQ,管道。

2、线程: 一个进程可以包含多个线程,线程就是CPU调度的基本单位。一个线程只属于某一个进 程。线程之间通讯,队列,await,signal,wait,notity,Exchanger,共享变量等等都可以实现 线程之间的通讯。

3、协程: 协程是一种用户态的轻量级线程。它是由程序员自行控制调度的。可以显示式的进行切换。 一个线程可以调度多个协程。 协程只存在于用户态,不存在线程中的用户态和内核态切换的问题。协程的挂起就好像线程的 yield。 可以基于协程避免使用锁这种机制来保证线程安全。 单独的拿协程和线程做一个对比: 更轻量: 线程一般占用的内存大小是MB级别。协程占用的内存大小是KB级别。 简化并发问题: 协程咱们可以自己控制异步编程的执行顺序,协程就类似是串行的效果。 减少上下文切换带来的性能损耗: 协程是用户态的,不存在线程挂起时用户态和内核态的切 换,也不需要去让CPU记录切换点。 协程优化的点: 协程在针对大量的IO密集操作时,协程可以更好有去优化这种业务。

二、Java中创建线程方式

Java中创建线程方式,只有一种,本质都是Runnable的形式。

1、继承Thread

2、Runnable,本质都是他! 3、Callable:Callable一般需要配合FutureTask来执行,执行的是FutureTask中的run方法,而 FutureTask实现了RunnableFuture的接口,RunnableFuture的接口又继承的Runnable。

4、线程池:线程池中的工作线程是Worker,Worker实现了Runnable,在构建工作线程时,会 new Worker对象,将Worker传递给线程工厂构建的Thread对象。本质还是Runnable。

三、如何结束线程

1、stop这种就不用说了。

2、现在结束线程比较优雅的方式只有一个, run方法结束 (正常结束,异常结束) 每个线程都有一个中断标记位,这个标记位默认是false。 当你执行这个线程的interrupt方法后,这个标记位会变为true while(!Thread.currentThread.isInterrupted()) 当你线程处于阻塞的状态下,比如await,wait,在阻塞队列,sleep等等,此时如果被中 断,会抛出InterruptedException 也可以直接指定共享变量。 volatile boolean flag = false; run(){ while(!flag){ // 处理任务!! } }

四、ThreadLocal的作用,和内存泄漏问题 在开发中会用到的方式就是 传递参数 。

ThreadLocal有两个内存泄漏问题: key: key会在玩花活使用ThreadLocal时 ,在局部声明ThreadLocal,局部方法已经执行完 毕,但是线程会指向ThreadLocalMap,ThreadLocalMap的key会指向ThreadLocal对象,这 会导致ThreadLoc会被al对象不回收。所以ThreadLocal在设计时,将key的引用更改为了弱引 用,如果再发生上述情况,此时ThreadLocal只有一个弱引用指向,可以被正常回收。 value: 如果是普通线程使用ThreadLocal,那其实不remove也不存在问题,因为线程会结 束,销毁,线程一销毁,就没有引用指向ThreadLocalMap了,自然可以回收。但是如果是线程 池中的核心线程使用了ThreadLocal,那使用完毕,必须要remove,因为核心线程不会被销毁 (默认),导致核心线程结束任务后,上一次的业务数据还遗留在内存中,导致内存泄漏问题。

五、伪共享问题以及处理方案 伪共享问题需要先掌握一下CPU缓存的事。

所谓的伪共享就是多个数据公用一个缓存行发生的问题。 当一个缓存行的64个字节,缓存了多个数据(ABCD),此时因为JVM的操作,A数据被修改了,但 是对于CPU来说,我只能知道当前缓存行的数据被修改了,现在的数据不安全,需要重新的去JVM 中将数据同步一次。 因为CPU执行的效率特别快,如果去主内存中同步一次数据,相对CPU的速度来说,就好像咱们执 行代码时查询了一次数据库,很影响效率。 想解决这个问题,避免其他线程写缓存行导致当前线程需要去主内存查询,可以让某个线程直接占满 当前缓存行的64k大小即可。 占满缓存行,独自使用,其实就是利用空间换时间的套路。 long l1,l2,l3,l4,l5,l6,l7; long value; long l9,l10,l11,l12,l13,l14,l15; 六、CPU缓存可见性问题发生的原因 CPU缓存可见性的问题,就是在缓存行数据发生变化时,会发出通知,告知其他内核缓存行数据设 置为无效。 但是因为CPU厂商为了提升CPU的执行效率,经常会追加一些优化的操作,StoreBuffer, Invalidate Queue。这些就会导致MESI协议通知受到影响,同步数据没那么及时。 所以CPU内部提供了一个指令, lock前缀指令 ,如果使用了lock前缀指定去操作一些变量,此时会 将数据立即写回到主内存(JVM),必然会触发MESI协议,类似StoreBuffer,Invalidate Queue的 缓存机制也会立即处理

标签:缓存,协程,面试,编程,并发,ThreadLocal,线程,内存,CPU
From: https://www.cnblogs.com/northli/p/18286417

相关文章

  • Python异步编程技术详解:async、await、yield和anext
    Python异步编程技术详解:async、await、yield和anext1.async和await2.yield3.anext4.StopAsyncIteration5.综合示例:异步聊天机器人总结异步编程是Python中一种强大的并发编程模式,可以显著提高I/O密集型应用的性能。本文将详细介绍Python中的几种重要的异步编......
  • 阿里面试:说说@Async实现原理?
    @Async是Spring3.0提供的一个注解,用于标识某类(下的公共方法)或某方法会执行异步调用。接下来,我们来看下@Async的基本使用和实现原理。1.基本使用@Async基本使用可以分为以下3步:项目中开启异步支持创建异步方法调用异步方法1.1开启异步支持以SpringBoot项目......
  • 30个Linux运维面试题,面试一线大厂必备!
    在本文中,我们将讨论30个Linux系统管理员面试问题以及经验丰富的专业人士的答案。(1)为什么需要LVM?LVM(Logicalvolumemanagement)推荐使用LVM管理linux服务器上的磁盘或存储,可以在线调整LVM分区的大小,而不用停止服务器。(2)如何检查内存和CPU统计信息?使......
  • C++语言相关的常见面试题目(三)
    1.List底层实现原理省流:list底层实现了一个双向循环链表。每个元素(或节点)包含三个部分:数据域(_M_Storage)、前驱指针(_M_prev)、后继指针(_M_next)。数据域:存储实际数据。前驱指针:指向链表中当前节点之前的一个节点。后继指针:指向链表中当前节点之后的一个节点此外,存......
  • 面试必会之MQ篇
    RabbitMQ01-你们项目中哪里用到了RabbitMQ?常用的中间件包括消息中间件(如ApacheKafka、RabbitMQ)、缓存中间件(如Redis、Memcached)、数据库中间件(如MySQL、MongoDB)我们项目中很多地方都使用了RabbitMQ,RabbitMQ是我们项目中服务通信的主要方式之一,我们项目中服务通信主......
  • 面试必会之事物控制
    01-什么是事务?事务就是用户定义的一系列数据库操作,这些操作可以视为一个完成的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元02-事务的特性有哪些?原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。一致性(Consistency):事务......
  • 字节面试 用double,1.0-0.9的结果不是0.1,为什么?
    让我详细解释一下为什么1.0-0.9在二进制中不能精确表示。1.0的二进制表示1.0在二进制中可以精确表示。它的二进制表示为:1.0=1.0(二进制)0.9的二进制表示0.9是一个无法在二进制中精确表示的小数。二进制小数是通过求和1/2,1/4,1/8,1/16,...等幂次表示的。对......
  • 面试必会之SpringBoot&SpringCloud
    01-讲一讲SpringBoot自动装配的原理1.在SpringBoot项目的启动引导类上都有一个注解@SpringBootApplication@SpringBootApplication@MapperScan("com.hxx.admin.dao")publicclassAdminApplication{publicstaticvoidmain(String[]args){SpringApplic......
  • 为什么现在的AI编程师都是用Python来编程?
    前言: 在当今AI大火的时节,涌入了一大批AI编程师,和AI训练师!显而易见他们都是用的Python语言来编程的。当然AI也给我们的工作带来了很多便利,比如AI绘画,写文章,视频剪辑,脚本创做等等方面现在都可以来用AI来协助我高效完成工作。那么我们来看看现在的AI编程师为什么都用Python语言......
  • 面试必会之Redis篇
    01-你们项目中哪里用到了Redis?在我们的项目中很多地方都用到了Redis,Redis在我们的项目中主要有三个作用:使用Redis做热点数据缓存/接口数据缓存使用Redis存储一些业务数据,例如:验证码,用户信息,用户行为数据,数据计算结果,排行榜数据等使用Redis实现分布......