【Head First Servlets and JSP】笔记9:属性的作用域、线程安全
1、到底什么是属性(Attribute)?
属性就是一个对象,可以被设置(bound,也可以叫绑定)到另外三个servlet API对象ServletContext、HttpSession、HttpServletRequest中。可以把它简单地认为是一个名/值对,名是String、值是object。在实际中,我们并不知道也不关心它具体如何实现,我们关心的只是属性所在的作用域。
2、属性不是参数(Parameter)!
笔记1中的参数——请求参数:

笔记7中的参数——servlet初始化参数:


以及,上下文初始化参数参数:


3、属性的3个作用域:
- ServletContext属性(上下文属性)——Web应用中的每一部分都能访问
- HttpSession属性(会话属性)——能访问特定的HttpSession的部分才可访问
- HttpServletRequest属性(请求属性)——能访问特定的ServletRequest的部分才可访问
4、设置、访问属性的API——每个接口(ServletContext、HttpS......)的属性API完全相同

关于Enumeration,参见Java-Enumeration总结 by IAMTJW
5、属性不好的一面.··.```..``..`.`.`...`..
- 上下文属性不是线程安全的!一个上下文属性可能同时被多个servlet所更改、访问。糟糕的解决方案是给doGet(或者是其它方法)加上synchronized,这样并不能解决问题,原因在于synchronized只能防止同一个servlet中的其他线程访问上下文属性,但是不能阻止另外一个servlet访问。关于synchronized参见java synchronized详解 by Gang.Wang。
正确的方法是:对上下文加锁,而不是对servlet加锁。怎么实现呢?看下面的代码:

- 会话属性是线程安全的吗?不是,因为用户可能打开好几个浏览器窗口...解决方案类似:

- 只有请求属性和局部变量是线程安全的!
要注意的是servlet的实例域不是线程安全的,除非实现了SingleThreadModel,或者是同步服务方法,但这是十分糟糕的做法,会让Web应用的效率变得非常差,所以,一个servlet根本不该有实例变量,有也应该是final的,如果真的需要在多个线程中共享一些东西,那就把它加到合适的作用域上去。
【Head First Servlets and JSP】笔记9:属性的作用域、线程安全的更多相关文章
- 【Head First Servlets and JSP】笔记23:Expression Language(EL) 完全攻略
基本上是<Head First Servlets and JSP>内容的整理.扩充.顺便推荐一个供参考的JSP教程:JSP Tutorial内容很全面,还有一些有趣的实例. 完整代码参考 ...
- jquery笔记之属性选择器 查找以某种条件开头的页面元素
jquery笔记之属性选择器 查找以某种条件开头的页面元素 转载:http://www.blogbus.com/amyqiong-logs/78340326.html $("div[id]& ...
- jsp四种属性范围
在JSP提供了四种属性的保存范围.所谓的属性保存范围,指的就是一个设置的对象,可以在多个页面中保存并可以继续使用.它们分别是:page.request.session.appliction. 1.pa ...
- 《APUE》读书笔记第十二章-线程控制
本章中,主要是介绍控制线程行为方面的内容,同时介绍了在同一进程中的多个线程之间如何保持数据的私有性以及基于进程的系统调用如何与线程进行交互. 一.线程属性 我们在创建线程的时候可以通过修改pthrea ...
- 《UNIX环境高级编程》(APUE) 笔记第十二章 - 线程控制
12 - 线程控制 GitHub 地址 1. 线程限制 下图为与 线程操作 有关的一些 限制: 可以通过 sysconf 函数进行查询 . 2. 线程属性 可使用 pthread_attr_t 结构修 ...
- 《深入了解java虚拟机》高效并发读书笔记——Java内存模型,线程,线程安全 与锁优化
<深入了解java虚拟机>高效并发读书笔记--Java内存模型,线程,线程安全 与锁优化 本文主要参考<深入了解java虚拟机>高效并发章节 关于锁升级,偏向锁,轻量级锁参考& ...
- 【Head First Servlets and JSP】笔记22:直接从请求到JSP & 获取Person的嵌套属性
直接从请求到JSP,不经过servlet <!DOCTYPE html> <html lang="en"> <head> <meta ch ...
- 【Head First Servlets and JSP】笔记18:JSP指令
mark. jetbrain tomcat配置:https://www.jetbrains.com/help/idea/2017.1/creating-and-running-your-first-w ...
- 【Head First Servlets and JSP】笔记 27: web 应用安全
典型的安全问题:假冒者.窃听者.非法升级者 认证方式: Base64 .摘要认证 .客户端证书.表单认证,重点熟悉摘要算法( HASH . MD5 等) 安全机制:授权.认证.数据完整性.机密性 80 ...
随机推荐
- Linux 总结2
cd pwd mkdir ...
- Manjaro折腾笔记:我的数据科学环境搭建之路
ss并且开机启动 0. 安装shadowsocks sudo pip install shadowsocks 1. 建立配置文件ss.json 我的位置是:/home/ray/Documents/sh ...
- 第一百八十八节,jQuery,选项卡 UI
jQueryUI,选项卡 UI 学习要点: 1.使用 tabs 2.修改 tabs 样式 3.tabs()方法的属性 4.tabs()方法的事件 5.tabs 中使用 on 选项卡(tab),是一种能 ...
- void bind(String sName,Object object);――绑定:把名称同对象关联的过程
void bind(String sName,Object object);――绑定:把名称同对象关联的过程 void rebind(String sName,Object object);――重新绑 ...
- 《转》Ubuntu14.04 openstack juno配置之 ceilometer遥測模块安装配置
(一)在控制节点上 1.安装的遥測服务 apt-get install -y ceilometer-api ceilometer-collector ceilometer-agent-central ...
- 【ask】webstorm调试node单个js文件
The procedure falls into two parts: first we start an application as usual and then connect to it wi ...
- OpenCV学习笔记十八:opencv_flann模块
一,简介: Fast Library for Approximate Nearest Neighbors (FLANN)算法库.
- jmeter安装启动报错:Not able to find Java executable or version. Please check your Java installation
1.xp安装jmeter后启动,出现下面错误,找了很多方法试了,都没有用: 2.最后找到一个方法解决了[感谢无名大神],在环境变量PATH中添加:%SystemRoot%/system32;%Syst ...
- drawableRightset 和 CompoundDrawables
android:drawableRight="@drawable/check_down" 在代码中的用法是: Drawable drawable = getResources(). ...
- mysql 存储二进制数据
晚上小研究了下MySQL存储于读取二进制数据的功能.关键步骤为以下三点: 最重要的一点:存储二进制数据的表的类型需要是blob类型(按长度不同分为tiny, media, long) 插入二进制数据时 ...