一、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 三个线程,如何保证三个线程同步执行?如何在并发情况下保证三个线程依次执行?如何保证三个线程有序交错运行?
这里要注意三个并发工具: CountDownLatch、CyclicBarrier、Semaphore
设定好信号量及释放时机
六、如何对一个字符串快速进行排序?
这里利用 Fork/Join 框架实现,具体原理这里不阐述了