1.Java Concurrency API 中的 Lock 接口(Lock interface)是什么?对比同步它有什么优势?Java并发API中的Lock
接口提供了一种比传统synchronized
块或方法更灵活、更强大的线程同步机制。Lock
接口允许更细粒度的锁控制,通过它可以实现更复杂的线程同步结构,而不仅仅是同步代码块或方法。
Lock接口的主要特点:
-
显式锁定和解锁:与
synchronized
隐式锁的使用不同,使用Lock
接口时,你需要显式地获取和释放锁。这提供了更好的控制,但也需要开发者手动管理锁的释放,以避免死锁。 -
尝试非阻塞地获取锁:
Lock
接口提供tryLock()
方法,允许线程尝试获取锁而不是无限期等待,这可以解决一些死锁问题。 -
可中断的锁获取操作:
lockInterruptibly()
方法允许线程在等待锁的过程中响应中断。 -
支持超时:
tryLock(long time, TimeUnit unit)
方法允许线程在给定的等待时间内尝试获取锁,如果在指定时间内没有获取到锁,线程可以放弃等待,这增加了更多的灵活性。 -
支持公平锁:一些
Lock
实现(如ReentrantLock
)提供了构造函数,可以创建一个基于公平策略的锁。公平锁意味着线程将按照请求锁的顺序来获取锁,减少饥饿现象。
与synchronized的对比优势:
- 灵活性:
Lock
提供了更多的锁操作功能,如尝试获取锁、设置超时和中断等待锁的线程,使得锁的管理更加灵活。 - 控制精度:
Lock
允许在不同的作用域中获取和释放锁,不仅限于同步块的范围内,提供了更细粒度的锁控制。 - 性能:在某些复杂的同步需求和高竞争环境下,
Lock
可能提供比synchronized
更好的性能。 - 公平性:
Lock
可以创建公平锁,而synchronized
块是非公平的。
尽管Lock
接口提供了比synchronized
更强大和灵活的同步控制能力,但它也需要更仔细的锁管理,包括确保在所有路径上锁都被正确释放,以避免死锁或资源泄漏。因此,选择使用Lock
还是synchronized
应根据具体的使用场景和需求来决定。对于简单同步需求,使用synchronized
可能更简洁方便;对于需要高度控制和灵活性的场景,Lock
可能是更好的选择。
2.jsp 和 servlet 有什么区别?
JSP (JavaServer Pages) 和 Servlet 是Java EE技术的两个核心组件,用于开发动态Web应用。它们之间的主要区别在于它们的用途、设计和工作方式。
1. 目的和设计哲学
- Servlet:是Java的服务器端程序,用Java编写,主要用于处理客户端的请求并生成动态内容。Servlet是控制层的技术,用于业务逻辑的处理和数据处理。
- JSP:是一种便于创建动态内容的Web页面技术。JSP可以看作是Servlet技术的扩展,它允许将Java代码嵌入到HTML页面中。JSP更侧重于视图,是用于展示层的技术。
2. 工作方式
- Servlet:当请求到达Servlet时,Servlet容器(如Tomcat)会加载并执行Servlet类的
service
方法来处理请求,并生成响应。开发者需要在Servlet中通过编写Java代码来生成整个页面。 - JSP:当请求指向JSP页面时,JSP引擎首先将JSP页面转换为一个Servlet源码,然后编译这个Servlet源码,生成对应的类文件,最后执行该Servlet。在JSP页面中,可以直接使用HTML标签,并在其中嵌入Java代码(通常通过特殊标签如
<% %>
实现)来生成动态内容。
3. 易用性和维护性
- Servlet:编写和维护需要深入的Java编程知识,所有内容都通过Java代码生成,这对于主要处理业务逻辑和数据的场景更适合。
- JSP:由于支持HTML标签,使得页面开发更为直观和简单。JSP允许Web开发者和设计师更容易地协作开发Web界面。
4. 性能
- Servlet:通常,由于Servlet是预先编译好的,它的执行速度比JSP快。Servlet适用于处理复杂的处理逻辑。
- JSP:虽然JSP页面最终也会被编译成Servlet,但这个转换和编译过程会在第一次请求时进行,可能导致第一次访问的性能稍差。不过,一旦编译完成,性能与Servlet相差无几。
总结
虽然JSP和Servlet在内部实现上有所不同,但它们都用于生成动态Web内容。选择使用JSP还是Servlet,主要取决于开发的需求、项目的结构以及开发团队的偏好。在现代Web应用开发中,经常将二者结合使用,利用Servlet处理复杂的业务逻辑,而使用JSP作为表现层来显示信息,以达到MVC(Model-View-Controller)设计模式的分离。
3.jsp 有哪些内置对象?作用分别是什么?
JSP (JavaServer Pages) 提供了一组内置对象(也称为隐式对象),这些对象在JSP页面中可直接使用,无需显式声明或初始化。这些内置对象提供了与Servlet容器和HTTP请求/响应等相关的功能。以下是一些常用的JSP内置对象及其作用:
1. request
- 类型:
HttpServletRequest
- 作用:代表客户端的请求。通过它可以获取到客户端发送的数据、查询字符串、请求参数等。
2. response
- 类型:
HttpServletResponse
- 作用:代表对客户端的响应。可以用来设置响应头、发送错误等。
3. out
- 类型:
JspWriter
- 作用:用于向客户端发送输出内容。通常用来输出HTML标记或文本数据。
4. session
- 类型:
HttpSession
- 作用:代表用户会话,可用于存储跨多个页面或请求的用户特定数据。
5. application
- 类型:
ServletContext
- 作用:代表整个Web应用的上下文环境,可用于存储全局共享数据。
6. config
- 类型:
ServletConfig
- 作用:提供了对Servlet配置信息的访问,如初始化参数。
7. pageContext
- 类型:
PageContext
- 作用:为JSP页面提供了一个存储属性的空间,并提供了对其他内置对象的访问。它是访问其他内置对象的入口。
8. page
- 类型:
Object
- 作用:代表JSP页面本身。在JSP页面中,
this
关键字就是page
对象的一个引用。
9. exception
- 类型:
Throwable
- 作用:仅在错误页面中可用,代表原始页面抛出的异常。
这些内置对象使得在JSP页面中处理请求、响应、会话管理和异常处理等变得更加简单直接。它们是JSP规范的一部分,确保了JSP页面的开发效率和便利性。