`

java 细枝末节

阅读更多

2. 关于Thread的误解

这个误解相当常见。
我们说一个方法是否是线程安全的,判断的标准只有一个,
这个方法是否访问了 可以写的“成员变量”。(所谓的state)
注意,只有两个条件:
(1)可以改变的 (2)成员变量
如果访问了可以写的“成员变量”,那么这个方法不是 线程安全的。
如果没有访问 可以写的“成员变量”,那么这个方法是 线程安全的。

方法的线程安全特性和传进来的参数毫无关系。
举个例子说明,为什么和参数毫无关系。

代码
  1. public class A {  
  2.    // 这个方法没有访问任何成员变量,本身是线程安全的。  
  3.    public void changeBuf(StringBuffer buf){  
  4.       buf.append("aaa");  
  5.    }  
  6. };  
  7.   
  8. 公用变量  
  9. public class Common{  
  10.    public static StringBuffer buf = new StringBuffer();  
  11. }  
  12.   
  13. Thread 1的代码:  
  14. A a1 = new A();  
  15. a1.changeBuf(Common.buf);  
  16.   
  17. Thread 2的代码:  
  18. A a2 = new A();  
  19. 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源代码的高手,能够指教。

分享到:
评论

相关推荐

    类与对象构建Java程序的基石优秀文档.ppt

    抽象的广义概念是这样定义的:从研究对象中提取与当前目标主题关系最密切的主要方面,而忽略掉与目标无关的那些方面或关系不大的细枝末节,从而更充分地注意与当前目标有关的方面,更明确地突出主题,这就是抽象。...

    张孝祥正在整理Java就业面试题大全

    - **掌握根本性的知识**:相比细枝末节,掌握基础知识更加重要,因为它们构成了后续学习的基础。 - **高效的学习策略**:比如在老师的指导下学习,可以更快地掌握核心概念并培养解决问题的能力。 ### 环境的影响 ...

    JAVA基础知识归纳(一)

    最近总有杠精在Q群跟我杠JAVA的一些细枝末节的基础知识,故出一系列“科普文”来怒怼杠精 JAVA switch语句表达式支持类型 支持类型大致有六种: int char byte short String(java 7才允许) 枚举 常见的boolean与...

    java6.0源码-linux-guide:Linux配置、应用、资源

    java6.0源码 Linux 配置及应用 个人日常使用发行版为 , Debian 系发行版大部分可套用或稍加改动使用。RedHat 系发行版可能随之后的使用情况而修订增加相关内容。 部分内容为使用 centos 或 oracle linux 中的内容,...

    百度地图开发java源码-BetterStep05:后台中转模式的WebRTC功能测试

    百度地图开发java源码 WebRTC实现服务器中转模式的多人视频通话 免费的东西,从来都不便宜。 老实讲,面对类似WebRTC这样一个复杂系统,我的内心是忐忑的。根据以往经验,开源产品通常充斥各种未知和不确定性,任何...

    [Eclipse.RCP深入浅出].Jeff.McAffer等.扫描版[目录].pdf

    《Eclipse RCP深入浅出》内容简介:Eclipse不只是一个单纯的流行IDE,其Rich ...《Eclipse RCP深入浅出》清楚展示了Eclipse RCP的细枝末节,全程实录了如何借助于Eclipse RCP设计、编码和打包优秀的Java应用程序。

    jsp+struts+hibernate+spring+mysql的新闻系统(源码完整直接运行,数据库记录已配好)

    java web开发初学者的绝佳入门实例,摒弃细枝末节,凸显核心思想。对之前新闻发布系统功能的扩充优化,增加了后台管理(不同管理员负责不同业务,登录界面:http://localhost:8080/news/adminLogin.jsp)。

    数据结构与算法分析——C语言描述(Weiss著)的学习笔记

    ^_^这本教科书所使用的是C语言,也许很多人会说C语言已经过时了,但是,我认为在数据结构的学习中,应该用尽量简单的语言,以免进入了语言的细枝末节中,反而冲淡了主题。实际上在国外的许多大学中(甚至中学),...

    containerx:Spring的初学者掌握其核心原理

    集装箱x简介 :high_voltage:一个迷你型Java依赖注入框架,代码量小,实现了依赖注入和AOP。适合Spring源码的初学者掌握核心原理。极少使用其他的第三方jar包。架构思路自己写一个Spring框架?博主,你在开玩笑吗?...

    Learn Objective-C Samples.rar

    3. **协议(Protocols)**:Objective-C的协议类似于Java和C#的接口,定义了一组可选的方法声明。对象可以遵循一个或多个协议,以实现特定的功能或交互。在样例中,可能有关于如何声明和遵循协议的示例。 4. **分类...

Global site tag (gtag.js) - Google Analytics