业务层勿用继承,不要为了方便舍弃了性能。TʌT不好意思我错了

很多人喜欢在action 或service或dao层继承一些公共的东西 比如jdbc或一些其他的东西 我看过一些小源码也经常这样 废话不多说 直入正题


直入正题前先科普一下TheardLocal类 懂的人直接跳

线程不安全指的是一个带有类成员变量(状态)的类的单列被多个线程访问时才会造成线程不安全,TheardLocal简单来说就是一个map (线程ID,对象),具体就不多说了,需要详细了解的请百度。

TheardLocal的出现解决了这一问题,现在很多框架都运用了这个技术,将所有的成员变量都放在TheardLocal内,这样就不会出现线程安全了,这也是为什么Spring jdbcTemplate的事物管理不会存在多线程安全问题。(你没发现你所有的注入用的都是这一个单列对象吗)还有很多很多地方都是这样的。

现在SpringMvc等使用的是方法及传惨,方法体有独自的栈,不存在线程安全,这样就可以让你的action无论多少个请求都只实列化一次并且不会造成线程安全。


上面这一段只 为告诉你 减少实例对象 使用单列模式 不然下面的没必要看了 因为目的就是为了减少实例对象


正题

四个很简单的java类


[code="java"]public class Animal {

public Animal(){
System.out.println(1);
}
}

[code="java"]public class Dog extends Animal{

}

[code="java"]public class Pig extends Animal{

}

[code="java"]public class Test {
public static void main(String[] args) {
new Dog();
new Pig();
}
}
输出的肯定是两个1

这能证明什么呢?

Animal 被实例化了两次 如果你的项目中action多达100个 甚至1000个 那么这个类被实例化的次数会随着你的action数量变得越来越多,如果你使用的是单列还好,如果是多列那这个次数就等于 请求数*子类


请使用注入的方式,因为它只是一个对象的引用,10000个引用它在内存中还是那么大。

不要为了那么两行代码的方便性影响了性能

使用继承前先想好它可能会有多少个子类,太多了就用注入,也就多两行代码。


楼主目前做的两个项目中业务层都没有用过继承,虽然几乎每个类都用了jdbc但是都是注入进来的。















实践验证真理 额 我承认我错了 不过也学到很多东西 感谢大家的打击
下面是我的实践


第一段

public class Animal {
public void getInfo(){
//一大堆代码
}
//还可以加N多方法运行结果也一致
}

public class Dog extends Animal{
}

public class Pig {
public Animal animal;
}

第一种运行方式 继承
public static void main(String[] args) {
Long begin = new Date().getTime();
List<Dog> l = new ArrayList<Dog>();
for (int i = 0; i < 1000000; i++) {
Dog d = new Dog();
l.add(d);//添加到一个集合里避免无引用被垃圾回收
}

Long runTime = new Date().getTime()-begin;
System.out.println(runTime);
}

第二种运行方式 注入
public static void main(String[] args) {
Long begin = new Date().getTime();
List<Pig> l = new ArrayList<Pig>();
Animal animal = new Animal();
for (int i = 0; i < 1000000; i++) {
Pig d = new Pig();
d.animal = animal;
l.add(d);//添加到一个集合里避免无引用被垃圾回收
}
Long runTime = new Date().getTime()-begin;
System.out.println(runTime);
}
两个运行结果占用内存一致时间几乎一致
证明一个非静态方法在内存中只会占一个地址 与静态的区别在于静态是系统启动时分配 非静态是第一次实例时分配 无论后续实例多少次它只会占用一个内存地址 所以测试时应该独立启动运行 不然第二步骤实例Animal类时其实一点时间也没花内存也没变


第二段
将Animal类添加一个非静态成员变量
public Integer age = new Integer(10);

两个运行结果 第二种运行时间内存占用比第一种小一倍
证明一个类在实例化的时候会为成员变量分配内存空间 而方法不会

第三段
将Animal类添加一个方法引用age
与第二段一致
证明方法在使用成员变量时只是引用不是复制

第四段
将Animal类添加一个构造函数
public Animal(){
//打印
}
注入的方式构造函数运行一次
继承的方式随子类实例次数


最后总结
1一个类在实例化时
非静态并且有值的成员变量(int long String这些类型在不使用构造传参时 如果参数一致在内存中也会存在一个)会在分配在内存中 以后每次实例也都会
非静态方法只会在第一次实例化时分配 以后每次的实例都只是引用

2父类在很多子类继承时构造函数不要过于复杂,因为构造函数在每次实例化时都会运行一次

3一个类如果构造函数是空并且也没有非静态不为空的成员变量那么
new 一个类一百次 和new一个类一次 加100此空循环 无论内存占用还是速度都一致 

转载于:https://www.cnblogs.com/shhaoran/archive/2013/02/04/2924524.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python棋盘最短路径_【leetcode】64. Minimum Path Sum 棋盘最短路径

1. 题目 Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path. Note: You can only move either down or right at any point in time. 2. 思路 从右下往左上移动&#x…

linux kvm安装win7,ubuntu14.04 使用kvm安装win7系统

办公电脑从win7换成ubuntu已经有几个月了..环境:ubuntu 14.04kvm 2.0.0需要的各种软件也都安装的差不多了.. 迅雷 qq office vmware 等 这些我常用的软件也都安装上了..我的电脑配置也算可以了(thinkpad E 系列 i5 8G内存 )但是vmware这个东西在ubuntu上的表现不是那么让人满意…

Python 18.4 aiohttp

aiohttpasyncio可以实现单线程并发IO操作。如果仅用在客户端&#xff0c;发挥的威力不大。如果把asyncio用在服务器端&#xff0c;例如Web服务器&#xff0c;由于HTTP连接就是IO操作&#xff0c;因此可以用单线程coroutine实现多用户的高并发支持。asyncio实现了TCP、UDP、SSL等…

python函数和模块有什么特性_python-函数包和模块

python函数的作用&#xff1a; 在Python代码段中如果有一段几十行的代码&#xff0c;需要多次重复使用这几十行代码时&#xff0c;为了提高代码的可用性&#xff0c;将代码段放进函数体内&#xff0c;以后在使用中直接调用该函数模块即可&#xff0c;函数是一个独立的函数体或是…

hibernate继承映射之每个具体类一张表

数据模型 表person 表student 表worker 对象模型 Person private String id;private String name;private int age;private String sex; Student extends Person private String school; Worker extends Person private String factory; xml配置&#xff1a; <?xml version…

linux系统下安装qgis,深度操作系统 deepin 15.11安装 QGIS 3.4

深度操作系统是基于Linux内核&#xff0c;以桌面应用为主的开源 GNU/Linux 操作系统&#xff0c;支持笔记本、台式机和一体机。深度操作系统(deepin)包含深度桌面环境(DDE)和近30款深度原创应用&#xff0c;及数款来自开源社区的应用软件&#xff0c;支撑广大用户日常的学习和工…

读取并修改App.config文件(转载)

1. 向项目添加app.config文件&#xff1a;右击项目名称&#xff0c;选择“添加”→“添加新建项”&#xff0c;在出现的“添加新项”对话框中&#xff0c;选择“添加应用程序配置文件”&#xff1b;如果项目以前没有配置文件&#xff0c;则默认的文件名称为“app.config”&…

No resource found that matches the given name 'android:Widget.Material.A解决方案

1&#xff1a;首先新建空白工作区 2&#xff1a;先import appcompat_v7 appcompat_v7在一个类似这样的地方&#xff0c; C:\mywork\android\android-sdk-windows\extras\android\support\v7\appcompat 然后用import进来&#xff0c;像如下操作&#xff1a; 确保sdk是5.0及以上 …

python easygui进度条_Python _easygui详细版

1. msgbox msgbox(msg(Your message goes here), title , ok_buttonOK, imageNone, rootNone) msgbox() 显示一个消息和提供一个"OK"按钮&#xff0c;你可以指定任意的消息和标题&#xff0c;你甚至可以重写"OK"按钮的内容。 import easygui as g g.msgbox…

linux ubuntu bionic,尝试在Linux Ubuntu 18.04 Bionic上安装Docker CE时出现错误?

阅读包裹清单......完成构建依赖树阅读国家信息......完成将安装以下新软件包&#xff1a;docker-ce0升级&#xff0c;1新安装&#xff0c;0删除&#xff0c;0未升级 .需要获得 0 B/33 &#xff0c; 8 MB 的档案 .执行此操作后&#xff0c;将使用 181 MB 的额外磁盘空间 . (Rea…

数据库完整性约束1

SQL的安全机制:完整性定义约束&#xff0c;视图机制&#xff0c;对用户进行授权控制 完整性约束分类: 1).根据数据对象的状态可分为: 静态约束与动态约束 a.静态约束: 隐式约束和显式约束 隐式约束&#xff1a;隐含于数据模型中的完整性约束。关系模型的隐式约束有域约束和表约…

python入门文件读取与写入_初学者Python:读取和写入同一文件

每个打开的文件都有一个隐式指针&#xff0c;该指针指示将在何处读取和写入数据。通常&#xff0c;它默认为文件的开头&#xff0c;但是如果您使用a&#xff08;追加&#xff09;模式&#xff0c;则默认为文件的结尾。还值得注意的是&#xff0c;w即使您添加到该模式&#xff0…

swappiness

2019独角兽企业重金招聘Python工程师标准>>> swappiness参数位于&#xff1a;/etc/sysctl.cof swappiness0表示最大限度使用物理内存&#xff0c;然后才是swap空间。swappiness100的时候表示积极的使用swap分区&#xff0c;并把内存上的数据及时地搬运到swap空间…

宏基笔记本4740 Linux,宏基4740g拆机【教程详解】

笔记本电脑 使用久了内部会累积有灰尘&#xff0c;这些灰尘可能会影响到正常的使用;还有些人觉得笔记本电脑内存不够&#xff0c;想要加装个内存条;亦或想要帮助笔记本电脑换cpu等&#xff0c;这些都是需要将笔记本电脑拆卸下来&#xff0c;然后才能够完成好相关的工作。宏基47…

[Codeforces Round #165 (Div. 2)]D. Greenhouse Effect

地址&#xff1a;http://codeforces.com/contest/270/problem/D 这题看过别人代码&#xff0c;理解了好久 本来觉得这题和USACO里的三值的排序是一样的&#xff0c;但是USACO里通不过......看来还得想 1 #include <iostream>2 #include <algorithm>3 using namespa…

如何正确创建DLL和使用DLL

如何正确创建DLL和使用DLL 本文将通过一个简单的实例来说明&#xff0c;如何正确的导出DLL中的类、对象、函数&#xff0c;并如何通过静态加载或动态加载的方式来使用DLL。 一、DLL中导出类、函数、对象 1. 创建一个空的Win32 Dynamic-Link Library项目Test 2. 在项目中添加一个…

C语言求35 45的最大公约数,C语言怎么求最大公约数和最小公倍数

#3段梦超2009-12-20 21:31输入两个正整数m和n, 求其最大公约数和最小公倍数. <1> 用辗转相除法求最大公约数 算法描述: m对n求余为a, 若a不等于0 则 m 最小公倍数 两个数的积 / 最大公约数#include int main(){int m, n; int m_cup, n_cup, res; /*被除数, 除数, 余数*/…

mysql-5.7.11-winx64.zip 安装配置

1、下载 http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.11-winx64.zip 2.解压缩zip包&#xff1b; D:\Program Files\mysql-5.7.11-winx64 3.配置环境变量&#xff0c; 3.1 添加path路径&#xff0c; D:\Program Files\mysql-5.7.11-winx64\bin 3.2.修改mysql-default.…

64位centOS5.4系统安装memcached

1.先下载相关资源libevent 和 memcached&#xff1b; #cd /temp #wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz #wget http://memcached.googlecode.com/files/memcached-1.4.5.tar.gz 2.判断系统是否已经安装了libevent #rpm -qa | g…

python用语句输入一个3*3的二维矩阵_python中二维数组的建立,输入和输出

for循环&#xff1a; for i in range(x,y,dir): pass 首先这个区间是左闭右开 其次dir在省略的情况下默认为1&#xff0c;就是每次加一&#xff0c;也可以指定 python的数组&#xff1a; python中是没有数组的&#xff0c;但是可以用list来代替数组 一维数组&#xff1a; 方法一…