- 浏览: 599442 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
实现servlet的单线程的jsp命令是:
<%@ page isThreadSafe="true|false" %>
默认值为true
isThreadSafe=false模式表示它是以Singleton模式运行。
该模式implements了接口SingleThreadMode,
该模式同一时刻只有一个实例,不会出现信息同步与否的概念。
若多个用户同时访问一个这种模式的页面,
那么先访问者完全执行完该页面后,后访问者才开始执行。
isThreadSafe=true模式表示它以多线程方式运行。
该模式的信息同步,需访问同步方法(用synchronized标记的)来实现。
一般格式如下:
public synchronized void syncmethod(...){
while(...) {
this.wait();
}
this.notifyAll();
}
那我们看看他编译后的servlet类和以前的servlet有什么不同?没有加入这条指令的页面中servlet类定义是:
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
………………………………//内部实现咱们大可以不看他。
}
而加入这个命令之后的类定义是:
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
SingleThreadModel {
…………………………//同样省略实现细节
}
我想大家应该很清楚的发现:加入<@page isThreadSafe="false">之后servlet是实现了SingleThreadModel接口的。有兴趣的朋友可以查下相关资料,其实这个接口在servlet2.4之后就废除了。那么为什么废除?实现了这个接口查看代码内容的时候却发现什么方法都没添加,为什么?
其实这个接口只是一个标识,让容器改变servlet生成策略的。
默认的,servlet容器是只创建servlet単实例,为请求提供线程池,我们为了能保证servlet的线程安全问题而不在servlet中添加实例属性。
但是如果一个servlet实现了SingleThreadModel接口那容器在创建实例池,为每个求情分配实例,当用户请求结束时将实例归还实例池。
这样做真的安全吗?非也!因为每个请求都会分发一个servlet实例,对于同用户下分发的不同的servlet来说很可能用到同一个session中的属性数据,这样当然出现了线程同步的问题,是不安全的!而且不同用户也可能享用同一个context中的数据,也是不安全的。于是在servlet2.4中建议不再使用这样的设置。
这样一来我们知道:如果非要实现servlet单线程那就要在servlet中实现SingleThreadModel接口,在jsp中添加<@ page isThreadSafe="false">命令。但是这是不被提倡的。
也有网友疑问:让servlet单线程而多实例本来不是为了线程安全的吗?为什么<@ page isThreadSafe=?>?的答案却是false?
我觉得这是个误区,这样设置真的是单线程吗?那肯定不是了,其实这个设置只是要容器保证同一时刻只有一个线程能在servlet的service方法中执行,因为默认的容器实例化servlet时时単实例,如果同时只有一个线程去管理这个唯一的servlet实例,那性能将是极其慢的,为了解决这个问题,容器采取了servlet实例池的方式。每个请求一个线程,而一个线程一个servlet。
因为这种方式并不是线程安全的,所以答案是false。
终上所述:其实这道题目是指如果让一个servlet实例对应一个线程,而不是一个servlet实例对应多个线程的默认方式。
<%@ page isThreadSafe=”false”%>
<%@ page isThreadSafe="true|false" %>
默认值为true
isThreadSafe=false模式表示它是以Singleton模式运行。
该模式implements了接口SingleThreadMode,
该模式同一时刻只有一个实例,不会出现信息同步与否的概念。
若多个用户同时访问一个这种模式的页面,
那么先访问者完全执行完该页面后,后访问者才开始执行。
isThreadSafe=true模式表示它以多线程方式运行。
该模式的信息同步,需访问同步方法(用synchronized标记的)来实现。
一般格式如下:
public synchronized void syncmethod(...){
while(...) {
this.wait();
}
this.notifyAll();
}
那我们看看他编译后的servlet类和以前的servlet有什么不同?没有加入这条指令的页面中servlet类定义是:
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
………………………………//内部实现咱们大可以不看他。
}
而加入这个命令之后的类定义是:
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
SingleThreadModel {
…………………………//同样省略实现细节
}
我想大家应该很清楚的发现:加入<@page isThreadSafe="false">之后servlet是实现了SingleThreadModel接口的。有兴趣的朋友可以查下相关资料,其实这个接口在servlet2.4之后就废除了。那么为什么废除?实现了这个接口查看代码内容的时候却发现什么方法都没添加,为什么?
其实这个接口只是一个标识,让容器改变servlet生成策略的。
默认的,servlet容器是只创建servlet単实例,为请求提供线程池,我们为了能保证servlet的线程安全问题而不在servlet中添加实例属性。
但是如果一个servlet实现了SingleThreadModel接口那容器在创建实例池,为每个求情分配实例,当用户请求结束时将实例归还实例池。
这样做真的安全吗?非也!因为每个请求都会分发一个servlet实例,对于同用户下分发的不同的servlet来说很可能用到同一个session中的属性数据,这样当然出现了线程同步的问题,是不安全的!而且不同用户也可能享用同一个context中的数据,也是不安全的。于是在servlet2.4中建议不再使用这样的设置。
这样一来我们知道:如果非要实现servlet单线程那就要在servlet中实现SingleThreadModel接口,在jsp中添加<@ page isThreadSafe="false">命令。但是这是不被提倡的。
也有网友疑问:让servlet单线程而多实例本来不是为了线程安全的吗?为什么<@ page isThreadSafe=?>?的答案却是false?
我觉得这是个误区,这样设置真的是单线程吗?那肯定不是了,其实这个设置只是要容器保证同一时刻只有一个线程能在servlet的service方法中执行,因为默认的容器实例化servlet时时単实例,如果同时只有一个线程去管理这个唯一的servlet实例,那性能将是极其慢的,为了解决这个问题,容器采取了servlet实例池的方式。每个请求一个线程,而一个线程一个servlet。
因为这种方式并不是线程安全的,所以答案是false。
终上所述:其实这道题目是指如果让一个servlet实例对应一个线程,而不是一个servlet实例对应多个线程的默认方式。
发表评论
文章已被作者锁定,不允许评论。
-
html pre标签使用(保留空格和回车等操作)
2018-05-15 08:37 2442pre 元素可定义预格式化的文本。被包围在 pre 元素中的文 ... -
java RESTful 详解
2018-04-27 11:35 643(1)每一个URI代表一种资源,独一无二; (2)客户端 ... -
缓存穿透(预设值防止多个进程读取数据库)、缓存并发、缓存失效(过期时间用随机数)学习
2018-02-22 14:25 435一、缓存穿透 我们在项 ... -
web http协议学习
2017-11-15 15:15 514HTTP协议是web开发必须掌握的协议之一,文章的内容并没有按 ... -
spring boot进行mybatis和JPA的整合
2017-08-30 10:12 4683初识spring boot Spring框架功能很强大,但是就 ... -
如何解决常见的缓存穿透、并发和失效问题
2017-04-12 09:25 507缓存穿透与并发方案 相信不少朋友之前看过很多类似的文章,但是 ... -
系统架构设计理论与原则、负载均衡及高可用系统设计速记
2017-02-14 15:14 488一、系统架构设计理论与原则 这里主要介绍几种常见的架构设计理论 ... -
java Cookie操作总结
2017-02-04 09:14 475java对cookie的操作比较简单,主要介绍下建立cooki ... -
HTTP Cache机制学习(response meta标签)
2017-01-03 15:10 739HTTP Cache:response头部设置、http页面m ... -
java Statement和PreparedStatement的区别
2016-12-02 10:43 426第一 prepareStatement会先初始化SQL,先把这 ... -
java AtomicInteger基于CAS的乐观锁实现
2016-11-16 11:13 4711. 悲观锁与乐观锁 ... -
java Guava cache学习笔记
2016-11-15 18:26 733缓存,在我们日常开发中是必不可少的一种解决性能问题的方法。简单 ... -
公钥、私钥和SSL详细说明(生动例子)
2016-11-11 08:43 577一,公钥私钥 1,公钥 ... -
spring ehcache配置以及使用(afterPropertiesSet)
2016-11-08 19:24 1361spring 配置ehcache例子:http://blog. ... -
java 各个连接池学习总结(DBCP C3P0 PROXOOL)
2016-11-08 19:00 1242要了解Java连接池我们先要了解数据库连接池(conne ... -
java 过滤器、监听器和拦截器区别
2016-11-08 10:21 417过滤器 Servlet中的过滤器Filter是实现了javax ... -
web HTTP TCP UDP协议详情
2016-11-07 19:44 992TCP HTTP UDP HTTP/TCP/UDP 都是通信 ... -
web tomcat配置多个host实例
2016-06-02 14:08 609tomcat server.xml配置如下 <Hos ... -
web 项目访问D盘中的图片文件(tomcat配置虚拟目录)
2016-05-24 14:49 4419找到/conf/server.xml,(即tomcat的安装目 ... -
web JSP页面按钮权限控制(tld标签标签类实现BodyTagSupport)
2016-03-16 14:31 7421.xxx-tags.tld(关联具体的tag类) 放在WE ...
相关推荐
#### 二、Servlet容器的单实例多线程处理模式 Servlet容器默认采用单实例多线程的方式处理请求,这意味着对于每个Servlet类,容器只会创建一个实例,并让这个实例服务于所有针对该Servlet的请求。这种方式减少了...
4. **Servlet单线程模式**:默认情况下,Servlet是多线程的,但可以通过在JSP页面中设置`isThreadSafe="false"`来强制实现单线程。 5. **页面间对象传递**:常用的方法有`request`作用域(一次请求),`session`...
8. **实现Servlet单线程模式**: 在JSP页面中设置`isThreadSafe`属性为`false`,防止并发访问同一Servlet实例。 9. **页面间对象传递方法**: - `request`:请求范围,仅限于一次请求。 - `session`:会话范围,...
9. **Servlet单线程模式**:可通过实现`SingleThreadModel`接口或在JSP中设置`isThreadSafe="false"`来限制同一时间仅有一个线程访问Servlet。 10. **HTTP的GET和POST请求**:GET请求将数据附加到URL,安全性和私密...
48. 实现servlet单线程模式,通常在service方法中使用同步锁。 49. JSP和Servlet的关系:JSP是视图,Servlet是控制器,两者共同构建MVC架构。 50. 会话跟踪技术包括cookie、session、URL重写和隐藏字段。 51. ...
55. **servlet单线程模式**:通过单例模式实现,确保只有一个Servlet实例。 56. **对象传递**:页面间对象传递可通过URL、session、cookie、隐藏字段等。 57. **JSP与Servlet关系**:Servlet处理请求,JSP生成响应...
4. 单例模式:如果Servlet实例不需要为每个请求都创建,可以使用单例模式,并确保所有可能的共享状态都是线程安全的。 5. 无状态Servlet:如果Servlet不需要保持任何状态,那么它天生就是线程安全的,因为没有共享...
### servlet与Struts action线程安全问题分析 #### 一、引言 在现代Web开发中,servlet和Struts框架被广泛应用于构建高性能、高并发的Web应用程序。然而,由于它们基于Java的多线程环境运行,因此线程安全问题成为...
5、如何现实servlet的单线程模式★★ 答:<%@page isThreadSafe=false%> 面试中会遇到! 6、页面间对象传递的方法 答:request,session,application,cookie等 7、JSP和Servlet有哪些相同点和不同点,他们...
通过`servlet`和`servlet-mapping`元素,我们可以指定Servlet的名称和对应的URL模式。例如,下面的配置创建了一个名为"HelloServlet"的Servlet,它的映射路径为"/HelloServlet": ```xml <servlet> <servlet-name>...
在“pushlet_向在线的特定用户发送消息的单线程应用”中,我们关注的是如何使用Pushlet来实现对特定在线用户的即时消息推送,并且整个应用是基于单线程设计的。 首先,我们需要理解单线程的含义。在多用户环境中,...
10. **MVC模式与Servlet**:虽然Servlet主要用于处理请求和响应,但在实际应用中,常常与Model-View-Controller(MVC)设计模式结合,如Spring MVC框架,将业务逻辑、视图渲染和控制逻辑分离。 通过深入学习Servlet...
此外,多线程模型在Servlet中也非常重要,因为Servlet通常在一个单独的线程中为每个请求服务,理解线程安全问题和同步机制是必要的。 在J2EE环境中,Servlet常与JavaServer Pages (JSP)一起使用,形成MVC设计模式的...
2. **异步处理**:Servlet 3.0引入了异步Servlet的概念,使得在处理长运行任务时,服务器不再需要为每个请求分配一个单独的线程,从而提高了服务器的并发性能。通过`ServletRequest.startAsync()`方法,开发者可以...
在异步模式下,当Servlet容器接收到请求后,会调用Servlet的`doService`或`service`方法,然后在该方法内启动一个异步操作。Servlet可以立即返回控制权给容器,而不用等待任务完成。容器会释放掉用于处理该请求的...
2. **线程安全**:Servlet默认为多线程环境设计,因此需要避免在实例变量中存储状态信息,以免引发线程安全问题。 3. **编码与解码**:处理HTTP请求和响应时,注意字符编码的一致性,避免乱码问题。 4. **资源释放...
12. **MVC模式支持**:虽然Servlet API本身不强制使用某种设计模式,但它与Model-View-Controller(MVC)模式很好地配合,使得开发者可以将业务逻辑、视图和控制分离,提高代码的可维护性。 13. **版本更新**:从...
在实际应用中,Servlet可能会遇到各种特殊的处理情况,这些情况涵盖了错误处理、会话管理、多线程问题、安全性等多个方面。下面,我们将详细探讨Servlet请求响应的特殊处理。 1. **错误处理**: - ` ...
10. **多线程安全**:Servlet容器为每个请求创建一个单独的线程,因此源代码需要确保Servlet实例是线程安全的,避免共享状态导致的问题。 在“servlet_src”压缩包中深入研究这些源代码,将有助于你更全面地理解...