静态函数

Java多线程中static变量的使用

老子叫甜甜 提交于 2020-03-30 11:44:35
线程,是我们项目中绕不过的重点领域。提到线程,就常会听到线程安全的术语。那什么是线程安全呢?通俗点说,就是线程访问时不产生资源冲突。其实,这是一个有点难以定义的概念,不是很容易让人一听就懂的概念。“一个类可以被多个线程安全调用就是线程安全的”《 Java 并发编程实践》。 来说说静态变量、实例变量、局部变量在多线程下的安全问题吧! (一)静态变量:线程非安全 1、静态变量:使用static关键字定义的变量。static可以修饰变量和方法,也有static静态代码块。被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被 类的所有实例共享 。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。 用public修饰的static成员变量和成员方法本质是 全局 变量和全局方法,当声明它的类的对象时,不生成static变量的副本,而是类的所有实例共享同一个static变量。 2、静态变量使用的场景: (1)对象间共享值时 (2)方便访问变量时 3、静态方法使用注意事项: (1)不能在静态方法内使用非静态变量,即不能直接访问所属类的实例变量; (2)不能在静态方法内直接调用非静态方法; (3)静态方法中不能使用this和super关键字; 4

类(二)的静态属性、类的方法、静态方法

冷暖自知 提交于 2020-03-30 02:00:44
一.类的静态属性 即是将类的函数属性,封装成类似数据属性。比如:类方法函数的返回值获取。通过:@proporty class Who(object): what = 'what' # brother = 'jack' def __init__(self,name,age,gender): self.name = name self.age = age self.gender =gender def information(self): print(self.name,self.age,self.gender) return self.name ##将函数增加一个返回值 p1 = Who('张三',18,'男') p1.information() ##实例化调用类的函数,有(),因为类的属性字典中存储的是函数的内存地址,调用需要加() print(Who.information) ##<function Who.information at 0x000002985CFFAA60> 运行结果:张三 18 男 ()+无返回值 :静态属性可以省去(),也可以获得返回值。 ##静态属性 class Who(object): what = 'what' # brother = 'jack' def __init__(self,name,age,gender): self.name = name

浅谈前端工程化

一笑奈何 提交于 2020-03-29 22:59:37
这段时间对项目做了一次整体的优化,全站有了20%左右的提升(本来载入速度已经1.2S左右了,优化度很低),算一算已经做了四轮的全站性能优化了,回顾几次的优化手段,基本上几个字就能说清楚: 传输层面:减少请求数,降低请求量执行层面:减少重绘&回流 传输层面的从来都是优化的核心点,而这个层面的优化要对浏览器有一个基本的认识,比如: ① 网页自上而下的解析渲染,边解析边渲染,页面内CSS文件会阻塞渲染,异步CSS文件会导致回流 ② 浏览器在document下载结束会检测静态资源,新开线程下载(有并发上限),在带宽限制的条件下,无序并发会导致主资源速度下降,从而影响首屏渲染 ③ 浏览器缓存可用时会使用缓存资源,这个时候可以避免请求体的传输,对性能有极大提高 衡量性能的重要指标为首屏载入速度(指页面可以看见,不一定可交互),影响首屏的最大因素为请求,所以请求是页面真正的杀手,一般来说我们会做这些优化: 减少请求数 ① 合并样式、脚本文件 ② 合并背景图片 ③ CSS3图标、Icon Font 降低请求量 ① 开启GZip ② 优化静态资源,jQuery->Zepto、阉割IScroll、去除冗余代码 ③ 图片无损压缩 ④ 图片延迟加载 ⑤ 减少Cookie携带 很多时候,我们也会采用类似“时间换空间、空间换时间”的做法,比如: ① 缓存为王,对更新较缓慢的资源&接口做缓存(浏览器缓存

一大波静态方法

99封情书 提交于 2020-03-29 07:00:37
取本地assets目录下fonts路径下的字体资源 public static Typeface getTypeface(Context context) { Typeface face = Typeface.createFromAsset(context.getAssets(), "fonts/BOD_PSTC.TTF"); return face; } 新建一个popWindow public static PopupWindow createPopWindow(Context context, int layoutId) { View view = LayoutInflater.from(context).inflate(layoutId, null); PopupWindow pop = new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); pop.setOutsideTouchable(false);// 点击外部退出 pop.setFocusable(true); pop.setBackgroundDrawable(new ColorDrawable(-00000));// 必须要这个,不然点击外部无效 pop.update();

C++中的自动存储、静态存储和动态存储

孤人 提交于 2020-03-28 07:10:27
根据用于分配内存的方法,C++中有3中管理数据内存的方式:自动存储、静态存储和动态存储(有时也叫做自由存储空间或堆)。在存在是间的长短方面,以这三种方式分配的数据对象各不相同。下面简要介绍这三种类型(注:C++11中新增了第四种类型——线程存储) 1.自动存储 在函数内部定义的常规变量使用自动存储空间,被称为自动变量(automatic variable),这意味着它们在所属的函数被调用时自动产生,在该函数结束时消亡。例如,挡在一个自定义的函数getname()中定义了一个temp数组时,temp数组仅当getname()函数活动时存在。当成许控制权回到main()时,temp使用的内存将自动被释放。如果getname()返回temp的地址,则main()中的name指针指向的内存将很快得到重新使用。这就是在getname()中使用new的原因之一。 实际上,自动变量是一个局部变量,其作用域为包含它的代码块。代码块是被包含在花括号中的一段代码。 自动变量通常存储在栈中。这意味着执行代码块时,其中的变量将依次加入到栈中,而在离开代码块时,将按相反的顺序释放着些变量,着被称为后进先出(LIFO)。因此,在程序执行过程中,栈将不断地增大和缩小。 2.静态存储 静态存储是整个程序执行期间都存在的存储方式。是变量称为静态的方式有两种:一种是在函数外面定义它

静态变量、全局变量和局部变量

家住魔仙堡 提交于 2020-03-28 06:44:07
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 堆和栈的区别: 一、预备知识——程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分: 1、栈区(stack)——由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap)—— 一般由程序员分配(如new、malloc)和释放(delete,free), 若程序员不释放,程序结束时可能由OS回收,但这样会导致内存泄露,严重的导致系统崩溃, 如一个程序是长期运行的,申请的变量永远都得不到释放,系统内存会耗尽。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 3、全局区(静态区)(static)——全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后由系统释放。 4、文字常量区 —— 常量字符串就是放在这里的。 程序结束后由系统释放 。 5、程序代码区 —— 存放函数体的二进制代码。 堆区就就是就是存放new出来的变量的 1.从作用域看: C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种: 1、全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然

静态内存和堆栈

╄→гoц情女王★ 提交于 2020-03-28 05:40:25
一、内存基本构成 可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。 栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。 但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。 代码区:存放函数体的二进制代码 文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 函数指针指向Code区,是程序运行的指令代码,数据指针指向Data,Heap,Stack区,是程序依赖以运行的各种数据 在文件作用域声明inline函数默认为static存储类型,const常量默认为static存储,如果加上extern,则为外部存储类型。 二、三者之间的区别 我们通过代码段来看看对这样的三部分内存需要怎样的操作和不同,以及应该注意怎样的地方

静态内存、动态内存与堆栈

五迷三道 提交于 2020-03-28 05:40:04
一、何谓静态内存、动态内存 静态内存分配好后,程序运行过程中一直存在不会被释放,且一旦分配好,其内存大小就固定下来不能改变,在编译和链接的阶段就会分配好。 动态内存是程序运行过程中,根据程序的需要分配和释放,其大小可变。 二、堆与栈 堆和栈都是动态分配的,区别有两点: 1、栈是由编译器分配与释放,堆是程序通过调用malloc或new分配,调用free或delete释放。 2、栈是线性结构,堆是链表结构。 三、使用场景 1、全局变量和static修饰的静态变量都存放在静态内存区。 2、函数内部定义的局部变量,存储在栈上,函数退出时,其占用内存被收回。 3、通过调用malloc或new得到的内存在堆上,不再需要时要显示的调用free或delete来释放,否则会造成内存泄漏,虽然有些操作系统会在程序退出后自动回收这部分内存,但还是要记住申请内存与释放内存成对操作,养成好习惯。 下面一段代码列举静态内存和动态内存的各种情形: //main.cpp int a = 0; //全局初始化区 ,静态内存 char *p1; //全局未初始化区 ,静态内存 main() { int b; //栈 char s[] = "abc"; //栈 char *p2; // 栈 char *p3 = "123456"; //"123456\0"在常量区,静态内存,p3在栈上。 static int c =0

用静态成员函数调用非静态成员变量

倾然丶 夕夏残阳落幕 提交于 2020-03-28 04:39:05
今天写程序要用到一个计时器,然后需要创建一个新的线程,这个线程是CtestDLG的一个成员函数,必须定义为静态的.但是这个时候就不能去访问非静态成员变量了,这里找到一个很好的解决办法: 先上代码: 1.线程函数的定义: private: int Count_time; CTime C_time; bool GetQuestion(); int mark;//考试分值,五个题目,一个20分,满分100 int QS[5];//随机题库序号 int count2;//题库总数 int count_Q;//当前输出的题目数量 static DWORD WINAPI Fun_Time(LPVOID lpParameter); }; 我们可以看到这个是一个类的成员函数 2.创建线程 void CTESTDlg::ONTIME() { HANDLE pThread_time = NULL; pThread_time = CreateThread(NULL,0,Fun_Time,this,0,NULL); } 这个是在一个消息函数中创建的.第四个参数传递的是一个this指针,指向当前的窗口类(这里很重要) 2.具体实现 DWORD WINAPI CTESTDlg::Fun_Time(LPVOID lpParameter) { CTESTDlg* temp = (CTESTDlg*

【转】全局变量、静态全局变量、静态局部变量和普通局部变量的区别

老子叫甜甜 提交于 2020-03-26 10:13:58
原文链接:https://blog.csdn.net/qq_39736982/article/details/82685277 按存储区域分: 1、全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区 2、局部变量存放在内存的栈区 按作用域分: 1、全局变量在整个工程文件内都有效; 2、静态全局变量只在定义它的文件内有效; 3、静态局部变量只在定义它的函数内有效,且程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。 4、全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。局部变量的值不可知。 5、静态局部变量与全局变量共享全局数据区,但静态局部变量只在定义它的函数中可见。静态局部变量与局部变量在存储位置上不同,使得其存在的时限也不同,导致对这两者操作 的运行结果也不同。 #include <stdio.h> void func();//函数声明,主要是因为被调用的函数定义写在了main函数后面了 int n = 1; //全局变量 int main(void) { static int a; // 静态局部变量,但静态局部变量只在定义它的函数中可见,并且只初始化一次 int b = -10; // 局部变量 printf("main: a=%d, b=%d, n=%d\n",a,b,n); b += 4; func()