hello uu们 感谢收看!!!!我最近听了一首歌《21》,真的很感慨,马上步入20的我也感觉时间真的飞快...望大家都能过上理想的生活,不负内心的所托...
正如人民日报所言,“请你努力,为了自己。”
三、多线程
- 并行和并发有什么区别?
- 并发是指多个任务在同一个时间段内进行,但在一个处理器上它们是交替执行的,可能是看起来像是同时的。在与之相对的并行执行中,多个任务同时在多个处理器上运行。举个例子,想象一下你在处理几个任务,你可能在同一时刻在咖啡机前等待,但真实的执行是轮流进行的,这就是并发。而当你有多个助手时,每个人可以同时完成一个任务,那就变成了并行。
- 线程和进程的区别?
- 进程是系统资源的基本分配单位,每个进程都有自己的内存空间,代码和数据。线程则是进程中的一个执行单元,多个线程共享同一个进程的内存空间。简单来说,线程是“轻量级”的,启动线程的开销比启动新进程小得多,所以在需要频繁的上下文切换时,使用线程会更高效。
- 守护线程是什么?
- 守护线程是后台线程,它和用户线程一起工作,主要用于执行一些辅助的任务,比如定时清理、资源监控等。当所有非守护线程结束时,JVM会自动退出,即使还有守护线程在运行。比如,Java的垃圾回收线程就是一个守护线程。
- 创建线程有哪几种方式?
- 创建线程主要有两种经典方式:
- 通过继承
Thread
类并重写run()
方法。 - 通过实现
Runnable
接口。这个方法更推荐,因为它能让你更灵活地扩展类,还能实现多个接口。
- 通过继承
- 还有一种新的方法,通过实现
Callable
接口和使用ExecutorService
来创建线程,这种方式允许你获得线程返回的结果。
- 说一下 runnable 和 callable 有什么区别?
Runnable
使用时,run()
方法没有返回值,也只能处理RuntimeException。而Callable
接口的call()
方法可以返回值,并且可以抛出检查时异常。因此,如果你需要线程返回结果或处理异常,使用Callable
会更合适。
- 线程有哪些状态?
- 线程的状态有五种:
- 新建(New):线程被创建但未开始。
- 就绪(Runnable):线程在等待CPU分配时间。
- 运行(Running):线程正在执行。
- 阻塞(Blocked):线程在等待获取锁,暂时无法执行。
- 死亡(Terminated):线程执行结束。
- sleep() 和 wait() 有什么区别?
sleep()
是一个静态方法,调用后会让当前线程进入睡眠状态,暂时不占用CPU,但不会释放锁。而wait()
是Object类中的一个方法,必须在同步块中使用,它会释放持有的锁,且线程会进入等待状态,直到其他线程调用notify()
或notifyAll()
。
- notify()和 notifyAll()有什么区别?
notify()
方法只能唤醒一个等待该对象锁的线程,而notifyAll()
会唤醒所有等待的线程。使用notifyAll提高了处理多个线程等待的灵活性,但性能上可能会有一些影响。
- 线程的 run()和 start()有什么区别?
start()
方法会启动新线程并调用run()
方法,而run()
方法是在当前线程中直接调用,实际上并不会启动新线程。因此,如果你直接调用run()
,那么实际上就是在当前线程中执行,而不是在新线程中。
- 创建线程池有哪几种方式?
- 创建线程池的常见方式有:
- 使用
Executors.newFixedThreadPool(int nThreads)
,创建一个固定大小的线程池。 - 使用
Executors.newCachedThreadPool()
,创建一个可缓存的线程池,适合处理许多短期任务。 - 使用
Executors.newSingleThreadExecutor()
创建一个单线程池,用于保证任务的顺序执行。
- 使用
- 线程池都有哪些状态?
- 线程池的状态有四种:
- RUNNING:可以接受新任务,也可以处理排队的任务。
- SHUTDOWN:不再接受新任务,但会处理排队的任务。
- STOP:不接受新任务,也不处理排队的任务。
- TIDYING:所有任务已终止,线程池正在清理资源。
- TERMINATED:线程池已完全结束。
- 线程池中 submit()和 execute()方法有什么区别?
execute()
方法用于执行Runnable
任务,不返回结果,而submit()
方法用于执行Callable
任务,返回一个Future
对象,允许你获取结果或处理异常。
- 在 java 程序中怎么保证多线程的运行安全?
- 可以使用关键字
synchronized
保证同一时刻只有一个线程能访问特定代码块或资源。还可以使用Lock
类,这提供了更加灵活的锁机制,比如公平锁和可中断的锁。此外,使用java.util.concurrent
包中的并发类也能增强安全性。
- 多线程锁的升级原理是什么?
- 锁的升级是为了提高性能,JVM会监视锁的状态,当某个线程获取了一个锁后,JVM会将其标记为“偏向锁”。如果有其他线程同时尝试获取同一把锁,JVM会把偏向锁转变为“轻量级锁”或者“重量级锁”,从而提高并发性能。
- 什么是死锁?
- 死锁是指两个或多个线程相互等待对方持有的锁而进入一种阻塞状态,最终导致这些线程无法继续执行。例如,线程A持有锁1并等待锁2,而线程B持有锁2并等待锁1,这就导致了死锁的发生。
- 怎么防止死锁?
- 防止死锁的方法有:
- 确保所有线程按相同的顺序请求锁。
- 使用定时锁,设置获取锁的超时时间。
- 使用
tryLock()
方法在Lock实现中尝试获取锁。
- ThreadLocal 是什么?有哪些使用场景?
ThreadLocal
提供一种线程隔离的方法,每个线程都有自己的变量副本。使用场景如线程池中的用户会话存储、数据库连接等。
- 说一下 synchronized 底层实现原理?
synchronized
通过JVM内置的监视器锁来实现,每个对象都有一个监视器锁。通过进入和退出同步块来绑定和释放锁,这样可以避免多线程访问同一资源时引发的数据不一致问题。
- synchronized 和 volatile 的区别是什么?
synchronized
用于买保证原子性和可见性,确保在多个线程中对共享资源的安全访问。而volatile
只是保证可见性,当一个线程修改变量后,其他线程能够立即看到这个变化,但不能保证原子性,适合用作状态标志。
- synchronized 和 Lock 有什么区别?
synchronized
是语言层面的关键字,使用比较简单,但灵活性低;Lock
接口则提供了更丰富的功能,如公平性和更细粒度的控制,但代码复杂度相对更高。
- synchronized 和 ReentrantLock 区别是什么?
ReentrantLock
是实现了Lock接口的类,支持公平锁和非公平锁,还允许中断。而synchronized
是语言层面的关键字,操作比较简便,但缺乏可定制性。
- 说一下 atomic 的原理?
- Java中的原子类如
AtomicInteger
使用了底层的CAS(Compare and Swap)机制,采用乐观锁的方法来实现原子性。通过原子操作避免了使用同步带来的性能开销。
四、反射
- 什么是反射?
- 反射是Java提供的一种强大机制,允许程序在运行时动态获取类的信息,包括类的构造方法、方法、属性等,并可以动态创建对象和调用方法。它使得Java更加灵活,适合构建框架和工具。
- 什么是 java 序列化?什么情况下需要序列化?
- Java序列化是将对象转化为字节流的过程,用于保存对象的状态或在网络间进行传输。常见场景包括:
- 将对象保存到文件中以便以后恢复。
- 在分布式系统中进行对象的远程传递。
- 动态代理是什么?有哪些应用?
- 动态代理是一种在运行时通过反射机制生成代理对象的技术,主要用于实现接口的代理。它的应用包括:
- 日志记录。
- 权限控制。
- 事务处理。
- 缓存,提高代码的可复用性。
- 怎么实现动态代理?
- 使用Java的反射API中的
Proxy
类,你需要创建一个实现InvocationHandler接口的类,重写其invoke()
方法来指定对目标方法的行为;然后通过Proxy.newProxyInstance()
方法创建代理对象。
五、对象拷贝
- 为什么要使用克隆?
- 克隆的主要目的是为了创建一个对象的副本,这个副本和原对象相互独立。常用在数据传输、缓存、或者需要频繁使用对象副本的情况下。
- 如何实现对象克隆?
- 通过实现Cloneable接口,并重写
clone()
方法。调用super.clone()
可以得到一个和原对象属性相同的新对象。
- 深拷贝和浅拷贝区别是什么?
- 浅拷贝只复制对象的引用,对于引用类型的属性,两个对象指向同一个内存地址;而深拷贝则会复制对象本身,包括对象内部的对象,从而确保独立。
六、Java Web
- jsp 和 servlet 有什么区别?
- Servlet是服务器端用Java编写的程序,主要处理业务逻辑,负责请求响应,而JSP是视图层的技术,可以直接嵌入HTML和Java代码,更适合用于生成动态网页。
- jsp 有哪些内置对象?作用分别是什么?
- JSP有九个内置对象,包括:
request
:封装客户端请求信息。response
:封装服务器的响应信息。session
:管理用户会话。application
:应用级别的信息。out
:输出流,用于向客户端写内容。config
:描述Servlet的配置信息。page
:当前JSP页面。exception
:处理错误信息。pageContext
:JSP页面特有对象,封装了其他特性。
- 说一下 jsp 的 4 种作用域?
- JSP的四种作用域是:
- page:只能在当前页面内有效。
- request:在同一个请求内有效,多个请求不共享。
- session:在同一个用户会话内有效。
- application:在整个Web应用内有效,所有用户共享。
- session 和 cookie 有什么区别?
- Cookie是存储在客户端的小文本文件,而Session是存储在服务器上的对象。Cookie的存储空间有限,适合存储少量数据,而Session能存储较大数据且不受客户端限制。
- 说一下 session 的工作原理?
- 当用户首次请求时,服务器会创建一个session对象,并生成一个唯一的session ID。这个ID通过cookie或URL重写的方式返回给客户端,之后的请求会带上这个ID,服务器使用它来识别用户会话。
- 如果客户端禁止 cookie 能实现 session 还能用吗?
- 是的,可以用URL重写的方式将session ID附加到每个URL中。虽然不是最理想的解决方案,但可以确保每次请求仍然能够正确识别会话。
- spring mvc 和 struts 的区别是什么?
- Spring MVC是基于Spring框架的轻量级MVC设计,其灵活性和可扩展性更强;而Struts是一种较早的MVC框架,配置相对复杂,主要使用XML配置,灵活性较低。
- 如何避免 sql 注入?
- 主要方法是使用预编译的语句(PreparedStatement),它可以帮助你有效地防止SQL注入,因为它会自动对输入进行转义。同时避免直接拼接字符串。
- 什么是 XSS 攻击,如何避免?
- XSS(跨站脚本攻击)是攻击者在Web页面中嵌入恶意脚本。避免XSS的办法是对用户输入进行严格校验和转义,确保不能直接插入不安全的内容,比如使用HTML实体进行处理。
- 什么是 CSRF 攻击,如何避免?
- CSRF(跨站请求伪造)是针对已登录用户的攻击,它利用了用户在另一网站打开恶意链接的行为。为了避免CSRF,可以使用令牌机制,每个请求携带唯一的token,服务器端验证这个token是否有效。
这篇多写一些!!都是各公司总结!辛苦了屏幕前奋斗的你!!!