多线程、JUC——面试问题自我总结

发布于:2025-04-16 ⋅ 阅读:(30) ⋅ 点赞:(0)

1、创建线程有几种方式

答:1、通过继承Thread类,但需要注意的是一个类继承Thread就不能继承其他的类了

       2、实现Runnable接口

       3、实现Callable接口,重写Call方法

       4、线程池

2、线程状态是怎么转换

3、实现线程的方式Callable与Runnable区别

答:1、Runnable 接口run方法没有返回值而Callable接口call方法有返回值,是个泛型

       2、Callable接口的call()方法允许抛出异常;而Runnable接口的run()方法的异常只能在内部消化,不能继续上抛

       3、wait必须要调用wait对象的锁而sleep无限制,wait会释放对象锁允许其他线程获取而sleep不允许

4、sleep与wait区别

共同点:都是让当前线程暂时放弃 CPU 的使用权,进入阻塞状态

不同点:sleep是Thread的静态方法而wait是Object的成员方法,各个对象都有

5、启动一个线程是用run()还是start()

start(): 用来启动线程,通过该线程调用run方法执行run方法中所定义的逻辑代码。start方法只能被调用一次

run(): 封装了要被线程执行的代码,可以被调用多次

6、Lock和synchronized区别

1、synchronized内置的java关键字,Lock是一个java接口                     

2、synchronized无法判断获取锁的状态, Lock可以判断是否获取到了锁

3、synchronized会自动释放锁,Lock必须要手动释放锁!如果不释放锁,会产生死锁

4、synchronized 线程1(获得锁),线程2(等待); Lock锁就不一定会等待下去,lock.tryLock()可以尝试去获取锁,不会一直等待,等不到就结束。

5、synchronized 可重入锁,不可以中断的,非公平的; Lock锁,可重入的,可以判断锁,非公平(可自己设置);

6、synchronized 适合锁少量的代码同步问题,Lock 适合锁大量的同步代码

7、为什么要有读锁和写锁

答:读可以多条线程同时读取,而写锁只能限定单条线程写入

8、可重入锁、悲观锁、乐观锁、公平锁、非公平锁

公平锁:不能插队,先来后到

非公平锁:可以插队,比如有些线程执行时间很短,但是也需要等待拿到锁的线程执行完

可重入锁:也叫做递归锁,是指在一个线程中可以多次获取同一把锁,某个线程已经获得某个锁,可以再次获取锁而不会出现死锁,再次获取锁的时候会判断当前线程是否是已经加锁的线程,如果是对锁的次数+1,释放锁的时候加了几次锁,就需要释放几次锁

乐观锁:核心思想是无需加锁,每次只有一个线程修改共享变量,其他失败的线程不需要停止不断的尝试,直到成功

悲观锁:核心思想是线程只有占了锁才会去操作共享变量,其他线程只有停下来等待