首页 > 编程语言 >Java-多线程-八股文

Java-多线程-八股文

时间:2023-07-16 18:01:10浏览次数:46  
标签:加锁 八股文 队列 阻塞 线程 Java 多线程 资源

  1. 线程安全的理解?
  2. 线程安全说的是,当多个线程并发访问互斥资源时,读写互斥资源的代码逻辑能正常处理,获得正确结果,不会互相干扰的情况。
    
  3. 守护线程的理解?
  4. 守护线程是与普通线程相区分的概念,用户一般使用的就是普通线程,普通线程有自身独立的生命周期,而守护线程的生命周期取决于普通线程,只有当所有相关的普通线程都结束时,守护线程才会结束。
    守护线程是为所有普通线程提供服务的线程
    
  5. threadlocal的底层原理
  6. threadlocal:在线程里面多保存了一份map结构,由于变量存在线程内部,从而保证不同线程互相不干扰。
    现在大多数用的都是线程池,由于线程都是复用的,而threadlocal往线程里面添加了一个map,因此,需要代码里面手动回收移除threadlocal保存的数据,否则,线程一直复用,数据量会一直累加至OOM。
    
  7. 并发、并行与串行之间的区别?
  8. 并行:多条处理流同时执行,例如多端口同时工作,多条线路同时传送数据
    串行:多条处理流排队执行。
    并发:例如微机系统上有多个进程存活,从宏观上,多个进程上同时工作,是个并行的流程,但是,从微观底层上来看,多个进程是由CPU通过时间片轮转,逐个调度执行的,是个串行的流程,这个就是并发。
    
  9. Java死锁应如何避免?-√
  10. Java死锁由四个因素导致:
    • 资源是互斥资源 每次仅可由单个线程持有
    • 在获得所有资源之前,线程自身不释放已持有资源
    • 所需资源在其他线程上,且不可被剥夺
    • 循环依赖,A持有B所需资源,B持有A所需资源
    应当打破第四点因素,即可避免死锁发生。 即将所有线程持有资源的顺序固定,避免产生循环依赖 每个锁的持有时间应当设置过期时间,确保锁最终一定会被释放
  11. 线程池底层工作原理-√
  12. num:线程数量
    当有任务需求时,
    当num<poolSize时,优先创建线程
    当num>poolSize时,且queue没满时,将任务添加到队列中排队
    当maxpoolsize>num>poolSize时,且queue已满时,增加线程处理任务
    当maxpoolsize==num,且queue已满时,不再新增线程,会按照handler所指定策略处理新任务。
    同时会检查,是否有线程的空闲时间大于keepalivetime,如果有,终止对应线程
    
  13. 线程池中阻塞队列的作用?线程池为何先添加队列而不是先创建线程-√
  14. 阻塞队列可以通过阻塞保留那些想要入队的任务;阻塞队列自带阻塞和唤醒功能,不需要一直占有CPU资源。
    因为创建新线程需要获取全局锁,影响其他线程的效率,且线程数量不足有可能是临时性不足,因此,优先排队等待。
    
  15. ReentrantLock中的公平锁与非公平锁的底层实现
  16. 加锁[竞争锁]:
    公平锁:新线程直接进入到队列
    非公平锁:先直接竞争锁,竞争不到再进入队列
    
    唤醒:无论公平锁还是非公平锁都会直接唤醒队列第一个获取锁
    
  17. ReentrantLock的tryLock()与lock()区别
  18. tryLock()可能加锁成功[返回真],也可能加锁不成功[返回假],非阻塞加锁
    lock()阻塞性加锁,一直执行,直到加锁成功
    

标签:加锁,八股文,队列,阻塞,线程,Java,多线程,资源
From: https://www.cnblogs.com/dengliang356a/p/17558273.html

相关文章

  • Java-Day-32( 多用户即时通信系统 —— 文件传输 + 服务器推送新闻 + 离线留言 )
    Java-Day-32多用户即时通信系统文件传输思路:客户端里先把文件读取到客户端为字节数组,把文件对应的字节数组封装到message对象,内含文件内容、sender、getter,将message对象发送给服务端拆解message对象获取getterid,获取客户端被指定的接收用户的通信线程,把message转......
  • Java-JVM-八股文
    线程共享区堆区与方法区是所有线程共享的栈区:主要存放基本数据类型与对象引用(仅限局部变量,成员变量不管是不是基本数据类型都存放于堆)堆区:主要存放对象实例与数组[我的理解就是,由代码操作生成的对象或者说引用类型存放于堆]方法区:类信息(class文件)、静态变量与静态方......
  • 自定义java@注解
    自定义注解主要用于抽象出重复代码,以减少枯燥无味的重复工作量举例:创建Redis分布式锁注解步骤:新建interface接口@Target(ElementType.METHOD)//描述注解使用范围@Retention(RetentionPolicy.RUNTIME)//设置注解时间范围//SOURCE源文件保留//CLASS,......
  • Java-集合-八股文
    list、setlist:有序,可重复,允许多个null,支持下标随机访问set:无序,不可重复,单一null,必须遍历访问arraylist、linkedlistarraylist:基于数组实现,占用连续空间,有利于查找、修改,不利于插入、删除[适用场景不同]linkedlist:基于链表实现,不要求占用空间连续,有利于插入、删除,不利于......
  • Java处理子父级菜单的方式二
    处理存在子父级关系的数据是写代码的过程中常见的操作,前面讲解过使用递归的方法来做,可以参考这篇博客https://www.cnblogs.com/yilangcode/p/16831867.html今天来聊聊一种新的处理方式。使用List集合多轮遍历,添加子父级菜单信息。建表SQLDROPTABLEIFEXISTS`sa_menu`......
  • java序列化和反序列化
    感觉网上很多博客对这个的解释实在太官方了,也没说为什么一定要实现序列化接口。去看看rpc框架源码,或者java网络编程或者向磁盘进行序列化就知道了。首先这是个标记接口,就是用来告诉程序某某对象是可序列化对象,像dubbo框架,要传输对象就必须序列化。网络编程已经告诉你了,想要向另......
  • Java性能优化-测试try-catch放在循环内和外的性能对比与业务区别
    场景Java中使用JMH(JavaMicrobenchmarkHarness微基准测试框架)进行性能测试和优化:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/131723751使用如上方式测试Java中try-catch放在循环内和循环外是否有性能上的差别。注:博客:https://blog.csdn.net/badao_lium......
  • 用java写一个逆置单链表
    用Java写一个逆置单链表单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的引用。逆置单链表是指将原来的单链表中的节点顺序颠倒过来。在这篇文章中,我们将使用Java来实现逆置单链表的功能。我们将会介绍单链表的基本概念,并给出逆置单......
  • 用java创建一个单链表
    使用Java可以很方便地创建和操作数据结构,其中包括单链表。单链表是一种常见的线性数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。这种数据结构可以用于实现队列、栈、链表等等。在本文中,我们将学习如何使用Java创建一个单链表,并演示一些基本的操作。首先,我......
  • day07 7.1 Java中的面向对象之类与对象
    day077.1Java中的面向对象之类与对象【一】类与对象【1】类定义规范类与对象的关系类是实体对象的概念模型,笼统的,不具体的,比如人类、动物类、鸟类对象又称为实体,类具体化的表现小红/小明小猫一号/小狗一号对象中有属性,有方法不同对象属性是独有的方法是共......