`
大猫汤姆
  • 浏览: 35059 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

SPRING的AOP不适合多线程应用?

阅读更多
yyyhbfl
分享到:
评论
13 楼 大猫汤姆 2008-10-14  
nihongye 写道


我直接就google了,找到一篇分析[url]http://blog.pramatiservices.com/spring-bean-creation-is-not-thread-safe

文中讨论了在并发环境下,得到未完全初始化的单例bean的bug。


上面说Spring2.0是有BUG的,但2.5已经修复了IOC的BUG。

不仅仅如此2.5的AOP也是非线程安全的。这不是BUG,这个是改变不了的。源代码只能那么实现了。
12 楼 axeon 2008-10-14  
再砸一下struts

如果说在所谓的企业应用中,这玩意有一席之地,在互联网应用中,完全是个垃圾。

1.效率问题。随便出个错,你可以发现struts相关的堆栈输出至少20条,这玩意还有效率可言么?

2.我为什么要统一配置页面转发和定向?直接在页面中定向页面转发和配置不是更有灵活性。在大系统中,约定规则不是更方便?

顺便砸taglib,除了降低系统效率之外,没有看出来其他用处。从某种程度上来说,采用mvc的思想,直接在页面中用java代码输出会易于编写和维护。
11 楼 axeon 2008-10-14  
支持tom猫,我也是来砸spring的。

我所理解的spring是相当低效率和无价值的,在我所经历和见到的spring项目中成功的少,垃圾的多。

一方面spring所倡导的概念仅仅是概念,缺乏实用性。小项目中太复杂,大项目用不上。使用spring之后,项目或产品的系统运维很麻烦,带来的好处倒是没觉得。

程序运行效率很重要,不可能因为机器便宜就可以盲目增加机器,一方面电力成本的问题,另一方面运维难度。

spring绝佳之处就在于概念,作为技术吹水的材料,spring是很适合的。
10 楼 nihongye 2008-10-14  

引用
这个是讨论的重点.
不是被代理对像,也不考虑程序员造成的安全问题.AOP框架本身不是线程序安全的.

我直接就google了,找到一篇分析http://blog.pramatiservices.com/spring-bean-creation-is-not-thread-safe/
文中讨论了在并发环境下,得到未完全初始化的单例bean的bug。

引用
性能问题,我估计你用的不是普通对相,如果是普通对像会应该差距这么小,普通对像应该是ArrayList的那种,String,无状态简单BEAN。这样的话性能相差至少是50倍吧。一会测下就行了。
仅仅创建的性能差距还不是全部,还有运行时执行aop框架对象的消耗时间,这个时间都要累加到CPU上面,所以各种因素加在一起影响就大了。

确实,代码里有一行new Date()导致,50倍基本一致。cglib的方式不知道性能怎样(我看一些例子的代码是可以先构建出proxy class,然后才创建实例)。这个累积效应,关键是不好量化。

9 楼 大猫汤姆 2008-10-14  
nihongye 写道
引用
1.我说的就是AOP的实现对象不是线程安全的.所以AOP单例本身就不是安全的,其中的接口数组,拦截器,被代理对像的引用等等,当多线程并发时会有意想不到的错误.

你是说被代理对象还是aop框架本身的问题?

这个是讨论的重点.
不是被代理对像,也不考虑程序员造成的安全问题.AOP框架本身不是线程序安全的.


性能问题,我估计你用的不是普通对相,如果是普通对像会应该差距这么小,普通对像应该是ArrayList的那种,String,无状态简单BEAN。这样的话性能相差至少是50倍吧。一会测下就行了。
仅仅创建的性能差距还不是全部,还有运行时执行aop框架对象的消耗时间,这个时间都要累加到CPU上面,所以各种因素加在一起影响就大了。

8 楼 lqql 2008-10-14  
MarkDong 写道
不能简单的认为单例就是线程不安全的,所有的无状态bean都是线程安全的

也不能认为无状态的bean就是线程安全的,如果方法里在读取和更改其他类里的公共变量就会有线程问题!
7 楼 nihongye 2008-10-14  
引用
1.我说的就是AOP的实现对象不是线程安全的.所以AOP单例本身就不是安全的,其中的接口数组,拦截器,被代理对像的引用等等,当多线程并发时会有意想不到的错误.

你是说被代理对象还是aop框架本身的问题?

引用
2.绝对不是三倍,远远大于三倍。机器便宜,但不能因为机器便宜就可以滥用资源。

收回我的结论,我的测试做了new Date()

引用
3.是否可测试与IOC没有关系.不用IOC也可以很方便的测试。

IOC只是一种思想,而spring是帮助实现这种思想的工具,如果对象足够复杂,有好工具总比没有好。




6 楼 大猫汤姆 2008-10-14  
nihongye 写道
第一:线程安全与否取决于是否存在线程同时修改某一东西(和aop没有关系)。
第二:代理对象的创建开销大概是3倍于普通对象(第一个比较长)
第三:ioc是架构上的选择,如果希望代码是可测试的,那么应该选它。


1.我说的就是AOP的实现对象不是线程安全的.所以AOP单例本身就不是安全的,其中的接口数组,拦截器,被代理对像的引用等等,当多线程并发时会有意想不到的错误.
2.绝对不是三倍,远远大于三倍。机器便宜,但不能因为机器便宜就可以滥用资源。
3.是否可测试与IOC没有关系.不用IOC也可以很方便的测试。

总的意思是,做项目选择合适的,SPRNG就像狗皮膏药一样到处贴,哪里都能用,到哪都能看到项目里面使用了SPRING,这样往往事倍功半.这样讲又回到了老问题,又有人会说到底应该学什么框架啊,其实我也说不好,各有所长,事事无绝对。

5 楼 MarkDong 2008-10-13  
不能简单的认为单例就是线程不安全的,所有的无状态bean都是线程安全的
4 楼 lqql 2008-10-13  
单例的话,可能肯定是线程不安全的吧!
3 楼 nihongye 2008-10-13  
第一:线程安全与否取决于是否存在线程同时修改某一东西(和aop没有关系)。
第二:代理对象的创建开销大概是3倍于普通对象(第一个比较长)
第三:ioc是架构上的选择,如果希望代码是可测试的,那么应该选它。
2 楼 大猫汤姆 2008-10-13  
tristan.cw 写道
每次都new不一定就是性能下降,你看struts2


不知道你说的依据是什么.
这其中的性能不会下降是凭感觉得来的吧.

1 楼 tristan.cw 2008-10-12  
每次都new不一定就是性能下降,你看struts2

相关推荐

    springboot基于AOP将web请求写入日志

    灰常简单,适合新手,一看就懂,本来就是新手写的

    Spring小例子项目源码

    项目源码,内有Spring AOP、事务、线程小例子,还有AOP实现原理,动态代理,java多线程

    Spring.3.x企业应用开发实战(完整版).part2

    10.4.1 Spring通过单实例化Bean简化多线程问题 10.4.2 启动独立线程调用事务方法 10.5 联合军种作战的混乱 10.5.1 Spring事务管理器的应对 10.5.2 Hibernate+Spring JDBC混合框架的事务管理 10.6 特殊方法成漏网之鱼...

    20万字必备java面试八股文宝典-多线程.数据库.Spring.SpringBoot.Linux.分布式.设计模式.面试指导

    这份宝典囊括了Java编程中的基础知识、多线程编程、数据库操作、Spring框架、Spring Boot、Spring Cloud、Linux操作系统、分布式系统、设计模式、面试指导以及自我介绍等内容。 基础部分,包括Java编程语言的核心...

    Spring Boot中使用AOP统一处理web层异常的方法

    主要介绍了Spring Boot中使用AOP统一处理web层异常的相关资料,需要的朋友可以参考下

    Spring3.x企业应用开发实战(完整版) part1

    10.4.1 Spring通过单实例化Bean简化多线程问题 10.4.2 启动独立线程调用事务方法 10.5 联合军种作战的混乱 10.5.1 Spring事务管理器的应对 10.5.2 Hibernate+Spring JDBC混合框架的事务管理 10.6 特殊方法成漏网之鱼...

    面试题问题合集.docx

    17. 多进程与多线程编程的区别?多线程的实际运行环境?怎么运用? 21.redis数据怎么缓存的值是什么形式?介绍redis缓存?redis的常用指令?redis分布式锁介绍和运用?redis集群如果一个宕机怎么办?秒杀的具体实现...

    Java常见面试题208道.docx

    面试题包括以下十九部分:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql...

    spring.net中文手册在线版

    多线程和并发操作 7.1.简介 7.2.线程本地存储 7.3.同步基础 7.3.1.ISync 7.3.2.SyncHolder 7.3.3.Latch 7.3.4.Semaphore 第八章. 对象池 8.1.简介 8.2.接口和实现 第九章. Spring.NET杂记 9.1.简介 9.2....

    IT|Java|面试|宝典

    多线程并发 4.java基础 5.spring原理 6.微服务 7.netty与rpc 及实现 8.网络 9.zookeeper 10.kafka 11.rabbitmq 12.hbase 13.mongodb 14.cassandra 15.设计模式 16.负载均衡 17.数据库 18.一致性算法 19.java算法 20....

    java面试题

    答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式允许其service方法,一个实例可以服务于多个请求,并且其实例一般不会被销毁,而CGI对每个请求都产生新的进程,服务完后就销毁,所以效率上...

    史上最全java面试,103项重点知识,带目录

    三、多线程 13 35. 并行和并发有什么区别? 13 36. 线程和进程的区别? 14 37. 守护线程是什么? 14 38. 创建线程有哪几种方式? 14 39. 说一下 runnable 和 callable 有什么区别? 15 40. 线程有哪些状态? 15 41. ...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【多线程】多线程的实现方式Thread、Runnable、Callable 72 【多线程】实现Runnable接口与继承Thread类比较 73 【多线程】线程状态转换 74 【多线程】线程的调度 75 线程优先级 75 sleep 76 wait 76 yield 77 join ...

    运用Spring框架实现简单调度

    当前很多开源项目也提供了比较全面的调度功能,如quartz、jcrontab、JobServer等,在这里我介绍一种比较简单的调度,没有quartz那么复杂,目的在于实用就行,这种调度就是spring提供的调度功能,该调度功能基于...

    Spring3中配置DBCP,C3P0,Proxool,Bonecp数据源

    在Spring3中配置数据源,包括DBCP,C3P0,Proxool,Bonecp主要的数据源,里面包含这些数据源的jar文件和依赖文件及配置文件。。 如Bonecp目前听说是最快的数据源,速度是传统的c3p0的25倍, bonecp.properties文件: ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    3.2 多线程 51 3.2.1 点睛 51 3.2.2 示例 51 3.3 计划任务 54 3.3.1 点睛 54 3.3.2 示例 54 3.4 条件注解@Conditional 56 3.4.1 点睛 56 3.4.2 示例 57 3.5 组合注解与元注解 60 3.5.1 点睛 60 3.5.2 示例 60 3.6 @...

    springboot学习思维笔记.xmind

    多线程 计划任务 cron fixDelay fixRate 条件注解@Conditional 组合注解与元注解 @Enable*注解的工作原理 直接导入配置类 依据条件选择配置类 动态注册Bean 测试 Spring ...

    structs+spring+servlet+Thread

    介绍了structs+spring+servlet+Thread的实现,其中介绍了listener、filter、servlet、Interceptor、aop技术、web多线程多种实现方式,下载即可运行

    Hands-On-High-Performance-with-Spring-5:Packt发布的Spring 5的动手高性能

    掌握Bean Wiring的最佳编程实践和性能改进分析各种AOP实施的性能探索与Spring的数据库交互以优化设计和配置解决Hibernate性能问题和陷阱利用多线程和并发编程来提高应用程序性能如果您觉得这本书适合您,请立即获取...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    3.2 多线程 51 3.2.1 点睛 51 3.2.2 示例 51 3.3 计划任务 54 3.3.1 点睛 54 3.3.2 示例 54 3.4 条件注解@Conditional 56 3.4.1 点睛 56 3.4.2 示例 57 3.5 组合注解与元注解 60 3.5.1 点睛 60 3.5.2 示例 60 3.6 @...

Global site tag (gtag.js) - Google Analytics