2. 关于Thread的误解
这个误解相当常见。
我们说一个方法是否是线程安全的,判断的标准只有一个,
这个方法是否访问了 可以写的“成员变量”。(所谓的state)
注意,只有两个条件:
(1)可以改变的 (2)成员变量
如果访问了可以写的“成员变量”,那么这个方法不是 线程安全的。
如果没有访问 可以写的“成员变量”,那么这个方法是 线程安全的。
方法的线程安全特性和传进来的参数毫无关系。
举个例子说明,为什么和参数毫无关系。
代码
- public class A {
-
- public void changeBuf(StringBuffer buf){
- buf.append("aaa");
- }
- };
-
- 公用变量
- public class Common{
- public static StringBuffer buf = new StringBuffer();
- }
-
- Thread 1的代码:
- A a1 = new A();
- a1.changeBuf(Common.buf);
-
- Thread 2的代码:
- A a2 = new A();
- a2.changeBuf(Common.buf);
<script type="text/javascript"><!----></script>
我们看到,这个Common.buf还是存在共享冲突。
但这个不是A.changeBuf()方法的问题,而是调用这个方法的问题。
而且,我们看到,这里的线程安全和是否共享实例根本就没有关系。
你就是创建1000个线程,分别调用1000个不同的实例,这种调用方法还是线程不安全。
结果和这1000个线程,都调用同一个共享实例的结果,没有任何区别。
这就是说,只要你不在Action类里面声明可写的成员变量,那么多个Request使用一个共享Action,还是分别使用不同的Action,结果完全一样。
(这种情况基本没有,因为Servlet,Action就是Stateless的,没有理由声明 可写的成员变量)
类和Object实例的基本概念:
同一个类的每个Object Instance都有自己的"成员变量备份",但是所有的Object Instance都共享同一份Java代码,不管这个方法是static method还是instance method.
线程的基本概念:
每个线程有自己的运行栈。线程只在自己的运行栈上运行方法。线程只和类的方法(method)有关。线程并不和任何具体Object实例有直接关系。
由于这个问题涉及的概念比较复杂,如果有疑问,
我可以举更多详细的例子,一步一步地说明所有问题。
因为这个误解太普遍了。不解决这个误解,很多问题的讨论都是南辕北辙,根本不成立的。
(3)关于Request的误解。
我想,这个Request应该是说HttpRequest这个参数。
我想要说明的是,根据基本常识,这个HttpRequest这个参数绝不可能被共享。
我查阅了好久Tomcat的源代码,但没有找到相关的从Socket连接生成Request的代码。所以,不能提供有力的证据。只能根据常识下这个判断。
希望有了解Tomcat源代码的高手,能够指教。
分享到:
相关推荐
抽象的广义概念是这样定义的:从研究对象中提取与当前目标主题关系最密切的主要方面,而忽略掉与目标无关的那些方面或关系不大的细枝末节,从而更充分地注意与当前目标有关的方面,更明确地突出主题,这就是抽象。...
- **掌握根本性的知识**:相比细枝末节,掌握基础知识更加重要,因为它们构成了后续学习的基础。 - **高效的学习策略**:比如在老师的指导下学习,可以更快地掌握核心概念并培养解决问题的能力。 ### 环境的影响 ...
最近总有杠精在Q群跟我杠JAVA的一些细枝末节的基础知识,故出一系列“科普文”来怒怼杠精 JAVA switch语句表达式支持类型 支持类型大致有六种: int char byte short String(java 7才允许) 枚举 常见的boolean与...
java6.0源码 Linux 配置及应用 个人日常使用发行版为 , Debian 系发行版大部分可套用或稍加改动使用。RedHat 系发行版可能随之后的使用情况而修订增加相关内容。 部分内容为使用 centos 或 oracle linux 中的内容,...
百度地图开发java源码 WebRTC实现服务器中转模式的多人视频通话 免费的东西,从来都不便宜。 老实讲,面对类似WebRTC这样一个复杂系统,我的内心是忐忑的。根据以往经验,开源产品通常充斥各种未知和不确定性,任何...
《Eclipse RCP深入浅出》内容简介:Eclipse不只是一个单纯的流行IDE,其Rich ...《Eclipse RCP深入浅出》清楚展示了Eclipse RCP的细枝末节,全程实录了如何借助于Eclipse RCP设计、编码和打包优秀的Java应用程序。
java web开发初学者的绝佳入门实例,摒弃细枝末节,凸显核心思想。对之前新闻发布系统功能的扩充优化,增加了后台管理(不同管理员负责不同业务,登录界面:http://localhost:8080/news/adminLogin.jsp)。
^_^这本教科书所使用的是C语言,也许很多人会说C语言已经过时了,但是,我认为在数据结构的学习中,应该用尽量简单的语言,以免进入了语言的细枝末节中,反而冲淡了主题。实际上在国外的许多大学中(甚至中学),...
集装箱x简介 :high_voltage:一个迷你型Java依赖注入框架,代码量小,实现了依赖注入和AOP。适合Spring源码的初学者掌握核心原理。极少使用其他的第三方jar包。架构思路自己写一个Spring框架?博主,你在开玩笑吗?...
3. **协议(Protocols)**:Objective-C的协议类似于Java和C#的接口,定义了一组可选的方法声明。对象可以遵循一个或多个协议,以实现特定的功能或交互。在样例中,可能有关于如何声明和遵循协议的示例。 4. **分类...