JAVA面试-多线程篇

一、JAVA如何开启多线程?怎么保证现场安全?

线程和进程的区别:
进程:是操作系统进行资源分配的最小单元
线程:是操作系统进行任务分配的最小单元
线程隶属于进程

开启线程:
1、继承 Thread 类,重写 run() 方法
2、实现 Runable 接口,实现 run() 方法
3、实现 Callable 接口,实现 call() 方法,通过 FuturnTask 创建一个线程,获取返回值
4、通过线程池来开启线程,使用方法参考阿里巴巴手册创建线程池事项
start() 方法开启线程,内部调用 run() 方法

保证线程安全:加锁
1、JVM 提供的的锁,syncronizer 关键字
2、JDK 提供的各种所,参考 JUC 工具包

二、volatile 和 syncronizer 有什么区别?volatile 能不能保证线程安全?DCL(Double Check Lock) 为什么要加 volatile?

1、syncronizer 关键字,用来加锁;volatile 关键字,只保证变量的线程可见性,通常适用于一个线程写,多个线程读的场景
2、volatile 不能保证线程安全,只能保证线程可见性,不能保证原子性
3、DCL 防止指令重排。加 volatile 防止高并发下,指令重排造成的现场安全问题

三、JAVA多线程锁机制是怎样的?偏向锁、轻量级锁、重量级锁有什么区别?锁机制是如何升级的?

1、JAVA的锁机制就是在对象的 Markwork 中记录一个锁状态。无锁(001)、偏向锁(101),轻量级锁(00),重量级锁(10) 对应不同的状态
2、JAVA 所机制就是根据资源竞争的激烈程度不断进行锁升级的过程
在这里插入图片描述

四、谈谈你对AQS的理解,AQS如何实现可重入锁?

1、AQS是一个JAVA线程同步的框架,是JDK中很多锁工具的核心框架
2、在AQS中,维护了一个信号量 state 和一个线程组成的双向链表队列。其中这个线程队列就是用来给线程排队的,而 statue 就像一个红绿灯,用来控制线程排队或者放行的,在不同的场景下有不同的意义
3、在可重入锁这种场景下,state 就是用来表示加锁的次数。0 表无锁,每加一次锁 state +1,释放锁则 state -1

五、有A、B、C 三个线程,如何保证三个线程同步执行?如何在并发情况下保证三个线程依次执行?如何保证三个线程有序交错运行?

这里要注意三个并发工具: CountDownLatchCyclicBarrierSemaphore
设定好信号量及释放时机

六、如何对一个字符串快速进行排序?

这里利用 Fork/Join 框架实现,具体原理这里不阐述了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值