2.3.1 IDEA中安装UML插件
- 没有show Diagrams https://blog.csdn.net/qq_41885819/article/details/100704918
- IDEA plugin搜索不出来https://blog.csdn.net/weixin_45525601/article/details/107046501
建议下载匹配版本,使用离线安装 https://plugins.jetbrains.com/plugin/7017-plantuml-integration/versions/stable
据说右键类能有Diagram选项
二、javax.servlet & jakarta.servlet
2.1 ServletConfig
从web.xml中读取配置
2.2 ServletContext
servlet 运行环境,同一个webApp中的Servlet共享一个Context。
- Servlet API version
就是这个jakarta.servlet包的版本
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
<scope>provided</scope>
</dependency>
2.3 servlet线程安全
servlet通过创建新一个的线程处理一个新的请求,对于使用servlet的外部资源时(如读写外部文件)需要考虑线程安全问题——多个线程需要同时读写同一个文件,这个时候需要一个安全的调度策略。
这里的线程安全设计到两个方向:
- 不同的servlet实例
- 同一个servlet实例中不同的线程
对于某一个可能会读取文件的线程来说,定位一个线程需要这样——(servlet A,Thread a)。
所以竞争一个资源,不能只考虑同一个servlet中的线程安全。
2.3.1 线程不安全(同一个servlet中的不同线程)
ThreadUnsafeServlet
import jakarta.servlet.GenericServlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import java.io.\*;
public class ThreadUnsafeServlet extends GenericServlet {
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
int counter = 0;
// get saved value
try {
BufferedReader reader = new BufferedReader(
new FileReader(getServletContext().getRealPath("/WEB-INF/counter.txt")));
counter = Integer.parseInt( reader.readLine() );
reader.close();
System.out.println("read " + counter);
}
catch (Exception e) {
}
// increment counter
counter++;
// delay for 6 seconds to make observation possible
try {
System.out.println("sleep");
Thread.sleep(6000);
}
catch (InterruptedException e) {
}
// saved new value
try {
System.out.println("write" + counter);
BufferedWriter writer = new BufferedWriter(
new FileWriter(getServletContext().getRealPath("/WEB-INF/counter.txt")));
writer.write(Integer.toString(counter));
writer.close();
}
catch (Exception e) {
}
try {
PrintWriter out = response.getWriter();
out.println("You are visitor number " + counter);
}
catch (Exception e) {
}
}
}
实验方式:开两个窗口,交替快速访问
http://localhost:8080/myApp/threadUnsafe
实验结果:读11读了3次,写12写了3次。说明在第一次读取11的线程休眠的时候,另外两个线程也读取了11。
2.3.1 同一个Servlet中的线程安全——SingleThreadModel被弃用
继承SingleThreadModel接口是限制一个servlet实例同时只服务于一个thread,以达到限制同一个servlet中的thread去竞争同一个资源的目的。这时候如果有别的servlet实例也要竞争同一个资源,那么情况就会变得混乱了。常见的资源有HttpSession(存储user的信息,一个user显然不可能从头到尾只单独地调用同一个servlet实例)。基于此,SingleThreadModel已经被弃用了。
更详细的讨论请参考:
(1) Why is (javax.servlet.)SingleThreadModel deprecated?
(2) Interface SingleThreadModel
2.3.2 不同servlet中的线程安全——线程安全的更优解决方案
更好地解决方式是,在代码块中使用synchronized
import jakarta.servlet.\*;
import java.io.\*;
public class ThreadSafeServlet extends GenericServlet{
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
synchronized (this) {
int counter = 0;
// get saved value
try {
BufferedReader reader = new BufferedReader(
new FileReader(getServletContext().getRealPath("/WEB-INF/counter.txt")));
counter = Integer.parseInt( reader.readLine() );
reader.close();
System.out.println("read " + counter);
}
catch (Exception e) {
# **最后**
分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。
**这些面试题相对应的技术点:**
* JVM
* MySQL
* Mybatis
* MongoDB
* Redis
* Spring
* Spring boot
* Spring cloud
* Kafka
* RabbitMQ
* Nginx
* ......
**大类就是:**
* Java基础
* 数据结构与算法
* 并发编程
* 数据库
* 设计模式
* 微服务
* 消息中间件
![程序员,每个月给你发多少工资,你才会想老板想的事?](https://img-blog.csdnimg.cn/img_convert/878cd739dd52d2667a6ee42123a2fecb.webp?x-oss-process=image/format,png)
![程序员,每个月给你发多少工资,你才会想老板想的事?](https://img-blog.csdnimg.cn/img_convert/8d9db51becbfab02113f97e1b220802c.webp?x-oss-process=image/format,png)
![程序员,每个月给你发多少工资,你才会想老板想的事?](https://img-blog.csdnimg.cn/img_convert/3734ac2eb0c91380ce017e5ed65dd25b.webp?x-oss-process=image/format,png)
![程序员,每个月给你发多少工资,你才会想老板想的事?](https://img-blog.csdnimg.cn/img_convert/c46e6d6a23f4388044b32357f3e47bbc.webp?x-oss-process=image/format,png)
![程序员,每个月给你发多少工资,你才会想老板想的事?](https://img-blog.csdnimg.cn/img_convert/e8b8237260b9bb935d31240dd1fe009c.webp?x-oss-process=image/format,png)
![程序员,每个月给你发多少工资,你才会想老板想的事?](https://img-blog.csdnimg.cn/img_convert/d93969bafdc4dfe669ff9d40d6d1d07b.webp?x-oss-process=image/format,png)
![程序员,每个月给你发多少工资,你才会想老板想的事?](https://img-blog.csdnimg.cn/img_convert/6cb460e23503ceaefb60569b890cba59.webp?x-oss-process=image/format,png)
![程序员,每个月给你发多少工资,你才会想老板想的事?](https://img-blog.csdnimg.cn/img_convert/b9b773a25b7a812cfd0863eddde8d554.webp?x-oss-process=image/format,png)
![程序员,每个月给你发多少工资,你才会想老板想的事?](https://img-blog.csdnimg.cn/img_convert/eb20c7937c1b9e13becacfe8d7e70b14.webp?x-oss-process=image/format,png)
304565214)]
[外链图片转存中...(img-6FT62OLE-1714304565214)]
[外链图片转存中...(img-CbOuosj9-1714304565215)]
[外链图片转存中...(img-9zmo31H4-1714304565215)]
[外链图片转存中...(img-ZEvG4F2z-1714304565215)]
[外链图片转存中...(img-z64ySwTG-1714304565216)]
> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/topics/618154847)收录**