成员变量

关键字volatile

随声附和 提交于 2019-11-30 01:04:45
Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。 Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。 这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。 而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。 使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。 由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。 ================================================================================= 实际工作中很少有用到volatile这个关键字,今天在看一段开源代码时碰到它,查了一下它的用法 : 用在多线程,同步变量 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B。

java 关键字之this

前提是你 提交于 2019-11-29 23:49:21
java 中的this关键字的几种用法 1. 当成员变量和局部变量重名时,在方法中使用 this时,表示的是该方法所在类中的成员变量。( this是当前对象自己) public class Hello { String s = "Hello"; public Hello(String s) { System.out.println("s = " + s); System.out.println("1 -> this.s = " + this.s); this.s = s;//把参数值赋给成员变量,成员变量的值改变 System.out.println("2 -> this.s = " + this.s); } public static void main(String[] args) { Hello x = new Hello("HelloWorld!"); System.out.println("s=" + x.s);//验证成员变量值的改变 } } 1 2 3 4 结果为:s = HelloWorld! 1 -> this .s = Hello 2 -> this .s = HelloWorld! s=HelloWorld!   在这个例子中,构造函数 Hello中,参数 s与类 Hello的成员变量 s同名,这时如果直接对 s进行操作则是对参数 s进行操作。若要对类

OC语言特性

别说谁变了你拦得住时间么 提交于 2019-11-29 21:48:48
Category 你用分类都做了哪些事情? 声明私有方法 分解体积庞大的类文件 把Framework的私有方法公开 特点 在运行时决议,也就是在编译时并没有把Category中声明的内容添加到宿主类中,而是在运行的时候通过runtime将添加的方法添加到宿主类上面 可以为系统添加分类 分类中可以添加哪些内容? 实例方法 类方法 协议 属性 Category结构 struct category_t { const char *name; //分类名称 classref_t cls; //分类所属的宿主类 struct method_list_t *instanceMethods; //实例方法列表 struct method_list_t *classMethods; //类方法列表 struct protocol_list_t *protocols; //协议 struct property_list_t *instanceProperties; //实例属性列表 // Fields below this point are not always present on disk. struct property_list_t *_classProperties; method_list_t *methodsForMeta(bool isMeta) { if (isMeta)

c/c++常见面试题(一)

佐手、 提交于 2019-11-29 21:39:57
0.static、const、volatile的作用和区别 static: https://www.cnblogs.com/Manual-Linux/p/8870038.html 第一 、在修饰变量的时候,static修饰的静态局部变量只执行一次,之后再初始化无效。而且延长了局部变量的生命周期,直到程序运行结束以后才释放。 第二 、static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。 第三 、static修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。Static修饰的局部变量存放在全局数据区的静态变量区。初始化的时候自动初始化为0 const: 1.修饰的变量只读,不可改变 2.防止意外修改,减少bug 3.可以节省空间,避免不必要的 内存分配 volatile: 告诉编译器这个变量随时可变,不需要优化 1.请问全局变量和局部变量能否重名 能,局部会屏蔽全局。要用全局变量,需要使用"::" 2. 用三目运算符(X)>(Y)?(X):(Y)宏定义实现比较两个数的大小 #define MAX(X, Y) ((X)>(Y)?(X):(Y)) 3.malloc的了解 malloc是动态内存分配,是用户动态申请系统分配指定字节的内存块的函数。返回类型是 void* 类型 对应free,

iOS成员变量和属性之间区别

荒凉一梦 提交于 2019-11-29 19:31:13
OC中的成员变量和属性是不一样的 @interface Person : NSObject{ //成员变量 NSString *name; NSInteger age; } //属性 @property (nonatomic,copy)NSString *address; @property(nonatomic,assign)CGFloat height; -(void)obtainInfo; @end 属性是用@property来定义的,属性是用_address来访问的,使用@property, 系统自动生成setter和getter.如果属性只使用 @property 声明,而没使用 @synthesize 的话,系统会自动的给你声明一个 _ 开头的实例变量。如果又使用 @synthesize 的话,则相当于声明了一个实例变量, https://www.cnblogs.com/huangzs/p/7508583.html 来源: https://blog.csdn.net/qq_31214097/article/details/100899423

JAVA不可变类(immutable)机制与String的不可变性

主宰稳场 提交于 2019-11-29 18:58:15
一、不可变类简介 不可变类 :所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。如JDK内部自带的很多不可变类:Interger、Long和String等。 可变类 :相对于不可变类,可变类创建实例后可以改变其成员变量值,开发中创建的大部分类都属于可变类。 二、不可变类的优点 说完可变类和不可变类的区别,我们需要进一步了解为什么要有不可变类?这样的特性对JAVA来说带来怎样的好处? 线程安全 不可变对象是线程安全的,在线程之间可以相互共享,不需要利用特殊机制来保证同步问题,因为对象的值无法改变。可以降低并发错误的可能性,因为不需要用一些锁机制等保证内存一致性问题也减少了同步开销。 易于构造、使用和测试 ... 三、不可变类的设计方法 对于设计不可变类,个人总结出以下原则: 1. 类添加final修饰符,保证类不被继承 。 如果类可以被继承会破坏类的不可变性机制,只要继承类覆盖父类的方法并且继承类可以改变成员变量值,那么一旦子类以父类的形式出现时,不能保证当前类是否可变。 2. 保证所有成员变量必须私有,并且加上final修饰 通过这种方式保证成员变量不可改变。但只做到这一步还不够,因为如果是对象成员变量有可能再外部改变其值。所以第4点弥补这个不足。 3. 不提供改变成员变量的方法,包括setter 避免通过其他接口改变成员变量的值,破坏不可变特性。 4

C++ 类的大小

随声附和 提交于 2019-11-29 18:21:53
1.类的大小与什么有关系? 与类大小有关的因素:普通成员变量,虚函数,继承(单一继承,多重继承,重复继承,虚拟继承) 与类大小无关的因素:静态成员变量,静态成员函数及普通成员函数 2.空类 空类即什么都没有的类,按上面的说法,照理说大小应该是0,但是,空类的大小为1,因为空类可以实例化,实例化必然在内存中占有一个位置,因此,编译器为其优化为一个字节大小。 某类继承自空类: class base { }; class derived:public base { private: int a; } 此时,derived类的大小为4,derived类的大小是自身int成员变量的大小,至于为什么没有加上父类base的大小1是因为空白基优化的问题,在空基类被继承后,子类会优化掉基类的1字节的大小,节省了空间大小,提高了运行效率。 3.一般类的大小(注意内存对齐) 首先上两个类的示例: class base1 { private: char a; int b; double c; }; class base2 { private: char a; double b; int c; }; 虽然上述两个类成员变量都是一个char,一个int,一个double,但是不同的声明顺序,会导致不同的内存构造模型,对于base1,base2,其成员排列是酱紫的: base1: base2: base

Java基础知识总结

我们两清 提交于 2019-11-29 17:15:43
本博文内容参考相关博客以及《Java编程思想》整理而成,如有侵权,请联系博主。 转载请注明出处: http://www.cnblogs.com/BYRans/ PDF版下载链接: 《Java基础知识总结》 。 如果您想在此基础上做一些修改,请联系dingyu.sdu@gmail.com,我把word原版发给您。 一:java概述: 1,JDK:Java Development Kit, java的开发和运行环境,java的开发工具和jre。 2,JRE:Java Runtime Environment, java程序的运行环境,java运行的所需的类库+JVM(java虚拟机)。 3,配置环境变量: 让java jdk\bin目录下的工具,可以在任意目录下运行,原因是,将该工具所在目录告诉了系统,当使用该工具时,由系统帮我们去找指定的目录。 环境变量的配置: 1 ): 永久配置方式:JAVA_HOME=%安装路径%\Java\jdk path=%JAVA_HOME%\bin 2 ): 临时配置方式:set path=%path%;C:\Program Files\Java\jdk\bin 特点:系统默认先去当前路径下找要执行的程序,如果没有,再去path中设置的路径下找。 classpath的配置: 1 ): 永久配置方式:classpath=.;c:\;e:\ 2 ):

类加载机制基础

落花浮王杯 提交于 2019-11-29 16:04:37
Java类加载机制的七个阶段 当我们的Java代码编译完成后,会生成对应的 class 文件。接着我们运行 java Demo 命令的时候,我们其实是启动了JVM 虚拟机执行 class 字节码文件的内容。而 JVM 虚拟机执行 class 字节码的过程可以分为七个阶段: 加载、验证、准备、解析、初始化、使用、卸载。 加载 下面是对于加载过程最为官方的描述。 加载阶段是类加载过程的第一个阶段。在这个阶段,JVM 的主要目的是将字节码从各个位置(网络、磁盘等)转化为二进制字节流加载到内存中,接着会为这个类在 JVM 的方法区创建一个对应的 Class 对象,这个 Class 对象就是这个类各种数据的访问入口。 其实加载阶段用一句话来说就是:把代码数据加载到内存中。这个过程对于我们解答这道问题没有直接的关系,但这是类加载机制的一个过程,所以必须要提一下。 验证 当 JVM 加载完 Class 字节码文件并在方法区创建对应的 Class 对象之后,JVM 便会启动对该字节码流的校验,只有符合 JVM 字节码规范的文件才能被 JVM 正确执行。这个校验过程大致可以分为下面几个类型: JVM规范校验。 JVM 会对字节流进行文件格式校验,判断其是否符合 JVM 规范,是否能被当前版本的虚拟机处理。例如:文件是否是以 0x cafe bene 开头,主次版本号是否在当前虚拟机处理范围之内等。

PlayJava Day019

久未见 提交于 2019-11-29 14:31:07
今日所学: /* 2019.08.19开始学习,此为补档。 */ 1.this: ①this是成员方法的一个特殊的固有的本地变量,它表达了调用这个方法的那个对象。 ②在成员方法内部直接调用自己(this)的其他方法。 2.本地(局部)变量: ①定义在方法内部的变量是本地变量。 ②本地变量的生存期和作用域都是方法内部。 ③成员变量的生存期是对象的生存期,作用域是类内部的成员方法。 3.构造方法:如果有一个成员方法的名字和类名完全相同,则在创建这个类的每一个对象的时候会自动调用这个方法。 4.private:针对类的而不是针对对象的,即同一个类的不同对象之间可以互相访问别人的私有成员。 来源: https://www.cnblogs.com/JavaDemo01/p/11519631.html