日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

描述Servlet生命周期,Servlet是線程安全的嗎? 為什么?

作者:柒畫503 更新時間: 2022-09-22 編程語言

一、什么是Servlet?

Servlet(Serve Applet)是Java Servlet的簡稱,用Java編寫的服務端端程序,具有獨立于平臺和協議的特性,主要功能在于交互式地瀏覽和生成數據,生成動態Web內容。Servlet 看起來像是通常的 Java 程序。Servlet 導入特定的屬于 Java Servlet API 的包。因為是對象字節碼,可動態地從網絡加載,可以說 Servlet 對 Server 就如同 Applet對 Client 一樣,但是,由于 Servlet 運行于 Server 中,它們并不需要一個。從這個角度講,Servlet 也被稱為 FacelessObject。一個 Servlet 就是 Java 編程語言中的一個類,它被用來擴展服務器的性能,服務器上駐留著可以通過“請求-響應”編程模型來訪問的應用程序。

二、Servlet的實現過程

1.客戶端發送請求到服務端;

2.服務端把請求傳給Servlet,Servlet處理請求并生成響應,然后將響應傳給服務端;

3.服務端把帶有動態數據的響應返回給客戶端。

有請求就一定會響應

三、Servlet的生命周期

1.實例化:Servlet容器創建Servlet的實例;

2.初始化:該容器調用init(ServletConfig)方法;

3.服務:如果請求Servlet,則容器調用service()方法;

4.銷毀:銷毀實例前一定會調用的destroy()方法;

?四、Servlet線程安全嗎?

Servlet默認是單例模式,一般來講它是非線程安全的。

在有成員變量的情況下,有多線程來修改成員變量的值,此時Servlet是非線程安全的。

package com.my.test;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Vector;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/demo.do")
public class Demo2Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	private int count = 0;
   
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		ExecutorService threadpool = Executors.newFixedThreadPool(200);
		for (int i = 0; i < 1000; i++) {
			threadpool.execute(new Runnable() {
				
				@Override
				public void run() {
					try {
						doPost(request,response,"http://localhost:8080/Servletday1/demo.do");
						System.out.println("*****"+Thread.currentThread().getName());
					} catch (ServletException e) {
						e.printStackTrace();
					} catch (IOException e) {
						e.printStackTrace();
					}
					
				}
			});
		}
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response,String url) throws ServletException, IOException {
		
		//處理亂碼
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
				
		//獲取資源
		PrintWriter out = response.getWriter();
				
		out.println(Thread.currentThread().getName()+" "+(++count));
		System.out.println(Thread.currentThread().getName()+"---------"+count);
				
				
		//釋放資源
		out.close();
	}
	
}

所以盡量避免使用成員變量,可以使用synchronized鎖、lock鎖和CAS去解決線程安全的問題。

只要service()的局部變量不是有線程安全安全問題的,Servlet基本是線程安全的。

原文鏈接:https://blog.csdn.net/weixin_56373368/article/details/126975730

欄目分類
最近更新