- 浏览: 4932639 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (2844)
- java (1094)
- hadoop (37)
- jvm (39)
- hbase (11)
- sql (25)
- 异常 (83)
- div css (6)
- 数据库 (95)
- 有趣的code (15)
- struts2 (6)
- spring (124)
- js (44)
- 算法 (65)
- linux (36)
- hibernate (7)
- 中间件 (78)
- 设计模式 (2)
- 架构 (275)
- 操作系统 (91)
- maven (35)
- tapestry (1)
- mybatis (9)
- MQ (101)
- zookeeper (18)
- 搜索引擎,爬虫 (208)
- 分布式计算 (45)
- c# (7)
- 抓包 (28)
- 开源框架 (45)
- 虚拟化 (12)
- mongodb (15)
- 计算机网络 (2)
- 缓存 (97)
- memcached (6)
- 分布式存储 (13)
- scala (5)
- 分词器 (24)
- spark (104)
- 工具 (23)
- netty (5)
- Mahout (6)
- neo4j (6)
- dubbo (36)
- canal (3)
- Hive (10)
- Vert.x (3)
- docker (115)
- 分布式追踪 (2)
- spring boot (5)
- 微服务 (56)
- 淘客 (5)
- mesos (67)
- php (3)
- etcd (2)
- jenkins (4)
- nginx (7)
- 区块链 (1)
- Kubernetes (92)
- 驾照 (1)
- 深度学习 (15)
- JGroups (1)
- 安全 (5)
- 测试 (16)
- 股票 (1)
- Android (2)
- 房产 (1)
- 运维 (6)
- 网关 (3)
最新评论
-
明兜3号:
部署落地+业务迁移 玩转k8s进阶与企业级实践技能(又名:Ku ...
Kubernetes系统常见运维技巧 -
q328965539:
牛掰啊 资料收集的很全面
HDFS小文件处理解决方案总结+facebook(HayStack) + 淘宝(TFS) -
guichou:
fluent挂载了/var/lib/kubelet/pods目 ...
kubernetes上部署Fluentd+Elasticsearch+kibana日志收集系统 -
xu982604405:
System.setProperty("java.r ...
jmx rmi 穿越防火墙问题及jmxmp的替代方案 -
大漠小帆:
麻烦问下,“获取每个Item相似性最高的前N个Item”,这个 ...
协同过滤推荐算法在MapReduce与Spark上实现对比
无状态就是一次操作,不能保存数据。无状态对象(Stateless Bean),就是没有实例变量的对象 .不能保存数据,是不变类,是线程安全的。
synchronized ( this ) {
++ hits ;
if (i.equals( lastNumber )) {
++ cacheHits ;
factors = lastFactors .clone();
}
}
if (factors == null ) {
factors = factor(i);
synchronized ( this ) {
lastNumber = i;
lastFactors = factors.clone();
}
}
private static boolean ready ;
private static int number ;
private static class ReaderThread extends Thread {
public void run() {
while (! ready )
Thread.yield ();
System. out .println( number );
}
}
public static void main(String[] args) {
new ReaderThread().start();
number = 42;
ready = true ;
}
上面的mian主线程运行时还充当了"写线程",并且新建"读线程"并让它运行.读线程会不断的循环直到ready的值为true.但在有些情况下,上面的程序会和我们想象的输入42相异:
由于JAVA的"重排序 "机制(JVM:只要代码顺序改变对结果不产生影响,那么就不能保证代码执行的顺序是书写的顺序)可能在对number设置值前ready的值就已经是true了.那么输入的结果会是0.
private int value ;
public synchronized int get() {
return value ;
}
public synchronized void set( int value) {
this . value = value;
}
如上代码可以被:volatile private int value;以及不加同步声明的getter,setter方法所代替.但当然会牺少许功能:加锁可以保证可见性和原子性,但volatile变量只能保证可见性 .所以,在不需要原子性的时候,可以用它.
EJB中的有状态与无状态:
1.Stateful session bean的每个用户都有自己的一个实例,所以两者对stateful session
bean的操作不会影响对方。另外注意:如果后面需要操作某个用户的实例,你必须在客户端缓存Bean的Stub对象(JSP通常的做法是用
Session缓存),这样在后面每次调用中,容器才知道要提供相同的bean实例。
2.Stateless Session Bean不负责记录使用者状态,Stateless Session Bean一旦实例化就被加进会话池中,各个用户都可以共用。如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响。
3.从内存方面来看,Stateful Session Bean与Stateless Session Bean比较,Stateful
Session Bean会消耗J2EE Server 较多的内存,然而Stateful Session
Bean的优势却在于他可以维持使用者的状态。
Spring中的有状态(Stateful)和无状态(Stateless)
1.通过上面的分析,相信大家已经对有状态和无状态有了一定的理解。无状态的Bean适合用不变模式,技术就是单例模式,这样可以共享实例,提高性能。有状态的Bean,多线程环境下不安全,那么适合用Prototype原型模式
。Prototype: 每次对bean的请求都会创建一个新的bean实例。
2.默认情况下,从Spring bean工厂所取得的实例为singleton(scope属性为singleton),容器只存在一个共享的bean实例。
3.理解了两者的关系,那么scope选择的原则就很容易了:有状态的bean都使用prototype作用域,而对无状态的bean则应该使用singleton作用域。
4.如Service层、Dao层用默认singleton就行,虽然Service类也有dao这样的属性,但dao这些类都是没有状态信息
的,也就是相当于不变(immutable)类,所以不影响。Struts2中的Action因为会有User、BizEntity这样的实例对象,是有
状态信息的,在多线程环境下是不安全的,所以Struts2默认的实现是Prototype模式。在Spring中,Struts2的Action
中,scope要配成prototype作用域。
Servlet、Struts中的有状态和无状态:
1.Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web
容器负责的。一个Servlet类在Application中只有一个实例存在,也就是有多个线程在使用这个实例。这是单例模式的应用。无状态的单例是线
程安全的,但我们如果在Servlet里用了实例变量,那么就变成有状态了,是非线程安全的。如下面的用法就是不安全的,因为user,out都是有状态
信息的。
/**
* 非线程安全的Servlet。
* @author Peter Wei
*
*/
public class UnSafeServlet HttpServlet{
User user;
PrintWriter out;
public void doGet (HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
//do something...
}
}
Out,Request,Response,Session,Config,Page,PageContext是线程安全的,Application在整个系统内被使用,所以不是线程安全的.
2.Struts1也是基于单例模式实现,也就是只有一个Action实例供多线程使用。默认的模式是前台页面数据通过actionForm传
入,在action中的excute方法接收,这样action是无状态的,所以一般情况下Strunts1是线程安全的。如果Action中用了实例变
量,那么就变成有状态了,同样是非线程安全的。像下面这样就是线程不安全的。
/**
* 非线程安全的Struts1示例
*
* @author Peter Wei
*
*/
public class UnSafeAction1 extends Action {
// 因为Struts1是单例实现,有状态情况下,对象引用是非线程安全的
User user;
public void execute() {
// do something...
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
3.Struts2默认的实现是Prototype模式。也就是每个请求都新生成一个Action实例,所以不存在线程安全问题。需要注意的是,如果由Spring管理action的生命周期, scope要配成prototype作用域。
4.如何解决Servlet和Struts1的线程安全问题,当我们能比较好的理解有状态和无状态的原理,自然很容易得出结论:不要使用有状态的bean,也就是不要用实例变量
。
如果用,就要用prototype模式。Struts1 user guide里有: Only Use Local Variables - The
most important principle that aids in thread-safe coding is to use only
local variables, not instance variables , in your Action class.
总结:
Stateless无状态用单例Singleton模式,Stateful有状态就用原型Prototype模式。
Stateful 有状态是多线程编码的天敌,所以在开发中尽量用Stateless无状态,无状态是不变(immutable)模式的应用,有很多优点:不用管线程和同步的问题
,如果值是不可变的,程序不用担心多个线程改变共享状态,所以可以避免线程竞争的bugs. 因为没有竞争,就不用用locks等机制,所以无状态的不变机制,也可以避免产生死锁现象。
发表评论
-
Kryo 使用指南
2017-12-05 20:14 18811、Kryo 的简介 Kryo 是一个快速序列化/ ... -
spring session序列化问题排查
2017-12-01 19:07 6152严重: Servlet.service() for ser ... -
利用junit对springMVC的Controller进行测试
2017-11-30 16:26 1398平时对junit测试service/D ... -
Java内存模型之重排序
2017-11-29 09:44 817在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重 ... -
pmd spotbugs 文档
2017-11-28 10:02 0https://pmd.github.io/pmd/pmd ... -
PMD、FindBug、checkstyle、sonar这些代码检查工具的区别?各自的侧重点是什么?
2017-11-28 10:01 2096可以说都是代码静态分析工具,但侧重点不同。pmd:基于源代码 ... -
阿里巴巴Java代码规约插件p3c-pmd使用指南与实现解析
2017-11-23 17:09 1534阿里巴巴Java代码规约插件安装 阿里Java代码规 ... -
静态分析工具PMD使用说明 (文章来源: Java Eye)
2017-11-23 17:07 1104质量是衡量一个软件是否成功的关键要素。而对于商业软件系统,尤 ... -
MyBatis 使用 MyCat 实现多租户的一种简单思路
2017-11-20 18:27 2799本文的多租户是基于多数据库进行实现的,数据是通过不同数据库进 ... -
Spring+MyBatis实现数据库读写分离方案
2017-11-20 17:15 1020百度关键词:spring mybatis 多数据源 读写分离 ... -
数据库连接池druid wallfilter配置
2017-11-20 11:38 1214使用缺省配置的WallFilter <be ... -
java restful 实体封装
2017-11-16 09:47 1538package com.mogoroom.bs.commo ... -
dak
2017-11-15 11:21 0package zzm; import jodd.ht ... -
Java内存模型之从JMM角度分析DCL
2017-11-15 09:35 590DCL,即Double Check Lock,中卫双重检查锁 ... -
Java 打印堆栈的几种方法
2017-11-14 09:36 4655java 中可以通过 eclipse 等工具直接打印堆栈, ... -
Servlet Session学习
2017-11-10 09:25 503HTTP 是一种"无状 ... -
浅析Cookie中的Path与domain
2017-11-10 09:26 1010Path – 路径。指定与co ... -
入分析volatile的实现原理
2017-11-08 09:47 624通过前面一章我们了解了synchronized是一个重量级的 ... -
Spring MVC-ContextLoaderListener和DispatcherServlet
2017-11-15 09:35 635Tomcat或Jetty作为Servlet ... -
搭建spring框架的时候,web.xml中的spring相关配置,可以不用配置ContextLoaderListener(即只配DispatcherServl
2017-11-07 18:27 1382搭建spring框架的时候,web.xml中的sprin ...
相关推荐
通过线程执行导入,并把正在执行的状态存入session,既共享执行状态,通过ajax调用session里的执行状态,从而实现反馈导入状态的功能! 上代码: 前端页面 <!DOCTYPE html> <html lang=en> <head> ...
2.threading.enumerate:返回一个包含正在运行的线程的list,正在运行的线程指的是线程启动后,结束前的状态 3.threading.activeCount:返回正在运行的线程数量,效果跟len(threading.enumer)一样 4.thr.setName:给...
使用 ASP.NET 创建一个线程的实现方法其实非常简单,只需将其声明并为其提供线程起始点处的方法...ASP.NET的Start方法用来使线程被安排进行执行,它有两种重载形式,下面分别介绍。 (1)导致操作系统将当前实例的状态
观察者模式当您有一些对象必须将一个对象的状态更改通知所有感兴趣的对象时,将使用观察者模式。 在图形上,这是这样工作的: 下图是它的uml表示:让我们建立模型观察者接口可以使用以下结构构建: public interface...
在项目中遇到需要处理超级大量的数据集,无法载入内存的问题就不用说了,单线程分批读取和处理(虽然这个处理也只是特别简单的首尾相连的操作)也会使瓶颈出现在CPU性能上,所以研究了一下多线程和多进程的数据读取和...
第5~8章是经典的Web Form部分,重点讲解了控件的原理与页面的生成机制,包括流与控件的关系、控件与页面的关系、数据绑定控件与模板的关系,以及ASENET中的各种状态管理技术。第9章分析了ASENET。MVC的处理过程,...
全新的一章,介绍了Windows支持线程的原因、线程开销、CPU动态、NUMA架构、CLR线程和Windows线程的关系、Thread类、使用线程的理由、线程调度和优先级、前台线程和后台线程。 Chapter 26-Performing Compute-Bound...
JDK1.5提供JMX remote的管理工具Jconsole,可以监控Java运行程序的内存使用情况、活动线程数量、类装载的数量、MBeans的状态、虚拟机的各种信息等,还可以执行MBean公开的方法或强制进行垃圾回收。只要应用服务器...
异步执行器版本:0.0.4 状态:开发人员作者:hsz 电子邮件: 描述用于运行协程的Asyncio执行程序。 这段代码来自< > 关键字:asyncio,执行器特征异步运行协程例子通过使用提交运行协程from concurrent . futures...
线程问题, 支持多个数字和, 为运行时关键绘图提供 blitting。 以下 TensorFlow 摘要由 . 它在测试表面上绘制了梯度下降优化器的进度。 为了避免重绘测试表面,它使用了位块传输。 有关更多介绍性示例,请参见下文...
答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。 40.接口是否可...
73、线程的基本概念、线程的基本状态以及状态之间的关系 18 74、sleep() 和 wait() 有什么区别? 18 75、socket通信(tcp/udp区别及JAVA的实现方式) 18 76、什么是java序列化,如何实现java序列化? 18 77、简述...
73、线程的基本概念、线程的基本状态以及状态之间的关系 18 74、sleep() 和 wait() 有什么区别? 18 75、socket通信(tcp/udp区别及JAVA的实现方式) 18 76、什么是java序列化,如何实现java序列化? 18 77、简述...
这个API是专门用以解决分布式,并发,多线程,多用户应用,包括活动的相关性,应用程序的状态转储,性能和用户定义的量度。 以下是它的特性: Simple programming model to facilitate fast root-cause, log ...
理想情况下,我们有第二个线程等待所有连接上的活动。 不幸的是,我们在 PHP 中没有用户态线程的奢侈(除非您想尝试 pthreads 并使这个线程安全 - 继续)。 因此,您需要在代码中添加一些内容来定期检查查询的状态...
普通的本地文件IO处于阻塞状态,无法轻松,便携地实现异步。 这意味着执行文件IO可能会干扰asyncio应用程序,该应用程序不应阻塞正在执行的线程。 aiofiles通过引入支持将操作委派给单独的线程池的异步版本的文件来...
BS.Play 的核心服务器部分 Comoro ,运行于*NIX 平台上,使用 C 语言开发,采用单进程静态多线程的事件 驱动模型,可以作为普通应用程序和守护进程执行。 Comoro 可以分别部署为 Coin Server、Login Server、Base ...
为避免多线程问题,必须对啤酒进行修改 用法 $ python main.py 有几种选项可以更改学习参数和行为。 rom:要播放的Atari rom文件。 默认为breakout.bin。 threads_num:要并行运行的学习者线程数。 默认为8。 ...
5.7.1 线程化的应用程序 5.7.2 其他适用性说明 第6章 socket状态 6.1 什么是socket状态 6.1.1 数据报socket的状态 6.1.2 流socket的状态 6.2 socket状态的检测方法 6.2.1 根据函数调用的成功或失败检测 6.2.2 同步...
5.7.1 线程化的应用程序 5.7.2 其他适用性说明 第6章 socket状态 6.1 什么是socket状态 6.1.1 数据报socket的状态 6.1.2 流socket的状态 6.2 socket状态的检测方法 6.2.1 根据函数调用的成功或失败检测 6.2.2 同步...