多线程面试总结(一)

复习总结

day06-----------------多线程(一)

1、进程和线程的区别

1. 进程是指一个正在执行的程序
2. 线程是指进程中执行的一个任务,有时候线程也被称为"轻量级进程"。

2、多线程编程的优点

1. 减少程序的响应时间
2. 线程的创建和切换比进程方便
3. 简化程序结构,方便维护

3、用户线程和守护线程

1. 守护线程是指在程序运行时在后台提供一种通用服务的线程。
2. 当所有用户线程结束时,程序会停止,同时杀死所有守护线程
3. 设置守护线程,setDaemon(true),守护线程创建的子线程仍然是守护线程

4、线程的生命周期

1. new
2. runnable
3. running
4. blocked
5. dead

5、如何创建一个线程

1. 继承Thread类,重写run方法
2. 实现Runnable接口,实现run方法
3. 实现Callable接口,实现run方法

6、run()和start()有什么区别

1. run()方法:会被当作普通方法调用
2. start()方法:启动线程

7、同步和异步的区别

在多线程环境中,经常会碰到数据共享的问题,即当多个线程需要访问同一个资源时,需要以
某种顺序来确保该资源在某一时刻只能被一个线程使用,否则,程序的运行结果将是不可预料的,
在这种情况下就必须对数据进行同步。

1. 要想实现同步操作,必须要获得每一个线程对象的锁。获得它可以保证在同一个时刻只有一个线程
   能够进入临界区(访问互斥资源的代码块),并且在这个锁释放之前,其他线程就不能进入这个临界
   区。如果还有其他线程想要获得该对象的锁,只能进入队列等待。只用当拥有该对象锁的线程退出
   临界区时,所才会被释放,等待队列中优先级最高的线程才能获得该锁,从而进入共享代码区。

2. java语言在同步机制中提供了语言级的支持,可以通过synchronized关键字来实现同步,可以同
   步代码块,也可以同步方法。

3. 异步:由于每个线程都包含了运行时自身需要的数据或方法,因此,在进行输入输出处理时,不必等
   到处理完毕才返回,因为会花费大量时间,应该使用异步编程,异步编程能够提高程序的效率。

8、sleep()和wait()的区别

1. 原理不同:
	1. sleep()方法时Thread类的静态方法,是线程用来控制自身流程的,它会使线程暂停执
   	   行一段时间,而把执行机会让给其他线程,等到计时时间一到,此线程会自动"苏醒"。
	2. wait()方法时Object类的方法,用于线程之间的通信,这个方法会使当前拥有该对象锁
	   的进程等待,直到其他线程调用notify()/notifyAll()。

2. 对锁的处理机制不同:
	1. sleep()方法的主要作用让线程暂停执行一段时间,时间一到则则自动恢复,不涉及线程之间
	   的通信,因此,调用sleep()方法不会释放锁。
	2. wait()方法会释放锁。

3. 使用区域不同:
	1. sleep()方法可以在任何地方使用
	2. wait()方法只能在同步方法或者同步代码块中使用

4. 是否需要异常处理:
	1. sleep()方法必须捕获异常
	2. wait()、notify()、notifyAll()不需要捕获异常

9、sleep()和yield()的区别

1. sleep()方法会给其他线程运行的机会而不会考虑优先级,而yield()方法只会给相同优先级或者
   更高优先级的线程以运行的机会。
2. 线程转入sleep()方法后会进入阻塞状态,指定时间内肯定不会执行,而yield()方法只是让当前
   线程重新回到可执行状态,所以它有可能到可执行状态后马上又被执行。
3. sleep()方法需要捕捉异常,yield()方法不需要。
4. sleep()方法比yield()方法具有更好的移植性。

10、synchronized和lock的区别

1. 用法不一样:
	1. synchronized既可以加在方法上,也可以加在代码上。
	2. lock需要显示指定起始位置和终止位置。

2. 性能不一样:
	1. 在竞争资源不是很激烈的情况下,synchronized的性能要优于ReentrantLock,
	2. 在竞争资源很激烈的情况下,synchronized的性能会下降的非常快,而ReentrantLock的性
	   能基本保持不变。

3. 锁机制不一样:
	1. synchronized获得锁和释放锁的方式都是在块结构中,当获取多个锁时,必须以相反的顺序
	   释放,并且是自动释放,不会因为异常而导致锁没有被释放而引起死锁。
	2. lock则需要开发人员手动去释放,并且必须在finally块中释放,否则会引起死锁的发生,
	   此外,lock还提供了更强大的功能,它的tryLock()方法可以采用非阻塞方式去获取锁。

11、当一个线程进入一个对象的一个synchronized方法之后,其他线程是否可以进入此对象的其他方法

1. 如果其他方法是非synchronized方法,是可以访问的。
2. 如果其他方法是synchronized方法,但是它又是static的,那么也是可以访问的。
3. 如果其他方法是synchronized方法,但是进入的这个方法内部调用了wait()方法,那么也是可以访问的。
4. 除以上几种情况,不能访问其他方法。

12、终止线程的方式有哪些

1. 在java语言中,可以使用stop()和suspend()方法来终止线程的执行。当调用stop()来终止线程时,它会释放
所有已经锁定的监视资源,会出现不确定性。调用suspend()方法由于不会释放锁,容易发生死锁。

2. 一般建议让线程自行进入Dead状态,可以设置一个flag标志来控制线程离开run()方法。

3. 通过制造异常并捕获来停止。

13、你对线程的优先级的理解是什么

每个线程都是有优先级的,一般来说,高优先级的线程在运行时会具有优先权,但这依赖于线程调度的
的实现,我们可以定义线程的优先级,但是这并不能完全保证高优先级的线程会在低优先级的线程前执行,

14、volatile关键字在Java中有什么作用?

当我们使用volatile关键字去修饰变量的时候,所有线程都会直接读取该变量而不会缓存它,这就保证
了线程读取到的变量是同内存中一致的。

15、什么是多线程上下文切换

CPU控制权由一个已经正在运行的线程切换到另外一个就绪并等待获取CPU执行权的线程的过程。

16、怎么检测一个线程是否持有对象监视器

Thread类提供了一个holdsLock(Object obj)方法

17、如何在两个线程间共享数据

1. 通过在线程之间共享对象就可以了,然后通过wait/notify/notifyAll、await/signal/signalAll进行唤起和等待

2. 比方说阻塞队列BlockingQueue就是为线程之间共享数据而设计的

猜你喜欢

转载自blog.csdn.net/qq_41606459/article/details/86636832
今日推荐