1、线程的基础知识
1.1、线程和进程的区别?
1.2、并行与并发有什么区别?
1.3、创建线程的方式有哪些?
1.4、线程中包括了哪些状态?状态之间是如何变化的?
1.5、新建T1、T2、T3三个线程,如何保证它们按照顺序执行?
1.6、notify和notifyAll有什么区别?
1.7、在java中wait方法和sleep方法有什么区别?
1.8、如何停止一个正在运行的线程?
第一种退出标志的例子:使用volatile关键字的目的是使其他线程对flag的修改对当前线程可见 避免编译器将其优化
package com.pdh.cache;
import lombok.extern.slf4j.Slf4j;
/**
* @Author: lihaojie
* @Description:
* @DateTime: 2024/4/25 10:38
**/
@Slf4j
public class MyInterrupt extends Thread{
volatile boolean flag = false;
@Override
public void run() {
while (!flag) {
log.info("MyThread...run...");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException {
// 创建MyThread对象
MyInterrupt t1 = new MyInterrupt();
t1.start();
// 主线程休眠6秒
Thread.sleep(6000);
// 更改标记
t1.flag = true;
}
}
2、线程的并发安全
2.1、Synchronized关键字的底层原理
当一个线程进入到Synchronized代码块之后,会让这个对象锁与这个Monitor进行关联,Monitor的Owner是否已经被别的线程持有,如果持有则进入到EntryList中进入到一个等待,并将该线程阻塞
2.2、Synchronized进阶
Monitor实现的锁都属于是重量级锁,你了解过锁升级吗?
- Monitor是JVM提供的,C++实现的,实现的锁属于重量级锁,里面涉及到了用户态和内核态的切换、进程的上下文切换,成本较高,性能比较低
2.3、谈一谈JMM(Java内存模型)
JMM(Java Memory Model)Java内存模型,定义了共享内存中多线程程序读写操作的行为规范,通过这些规则来规范对内存的读写操作从而保证指令的正确
2.4、CAS你知道吗?
2.5、请谈谈你对volatile的理解
返回结果:
为什么第三个线程一直没有打印呢?实际上是因为JVM虚拟机中有一个JIT(即时编译器)对代码做了优化