引用类型

全面了解 Java 原子变量类

Deadly 提交于 2019-12-27 18:33:05
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 📦 本文以及示例源码已归档在 javacore 一、原子变量类简介 为何需要原子变量类 保证线程安全是 Java 并发编程必须要解决的重要问题。Java 从原子性、可见性、有序性这三大特性入手,确保多线程的数据一致性。 确保线程安全最常见的做法是利用锁机制( Lock 、 sychronized )来对共享数据做互斥同步,这样在同一个时刻,只有一个线程可以执行某个方法或者某个代码块,那么操作必然是原子性的,线程安全的。互斥同步最主要的问题是线程阻塞和唤醒所带来的性能问题。 volatile 是轻量级的锁(自然比普通锁性能要好),它保证了共享变量在多线程中的可见性,但无法保证原子性。所以,它只能在一些特定场景下使用。 为了兼顾原子性以及锁带来的性能问题,Java 引入了 CAS (主要体现在 Unsafe 类)来实现非阻塞同步(也叫乐观锁)。并基于 CAS ,提供了一套原子工具类。 原子变量类的作用 原子变量类 比锁的粒度更细,更轻量级 ,并且对于在多处理器系统上实现高性能的并发代码来说是非常关键的。原子变量将发生竞争的范围缩小到单个变量上。 原子变量类相当于一种泛化的 volatile 变量,能够 支持原子的、有条件的读/改/写操 作。 原子类在内部使用 CAS 指令(基于硬件的支持)来实现同步

值类型和引用类型

こ雲淡風輕ζ 提交于 2019-12-27 14:05:34
值类型和引用类型 值类型 值类型这个概念经常出现在类似C#,JAVA等编程语言的书籍中."值类型"直接将内存存储在栈内,由系统自动释放资源的数据类型. 与值类型相对应的有引用类型.C#语言中还对应指针类型. 值类型编辑 每一种编程语言的值类型都有一些非常细小的不同.下文所指的内容仅仅是.NET框架中C#编程语言的值类型定义. 整体来说C#的值类型有: [1] 整型:Int; 长整型:long; 浮点型:float; 字符型:char; 布尔型:bool 枚举:enum 结构:struct 在C#中所有的值类型都继承自:System.ValueType 主要功能编辑 基于值类型的变量直接包含值。 [2] 将一个值类型变量赋给另一个值类型变量时,将复制包含的值。这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。 所有的值类型均隐式派生自SystemValueType。 与引用类型不同,不能从值类型派生出新的类型。但与引用类型相同的是,结构也可以实现接口。 与引用类型不同,值类型无法包含null值。但是,可以为 null 的类型功能允许值类型分配给null。 每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。 中值类型编辑 在使用 C# 中的局部变量之前,必须对其进行初始化。 [3] int myInt; 那么在将其初始化之前,无法使用此变量

第4章 变量、作用域和内存---JS红宝书书摘系列笔记

房东的猫 提交于 2019-12-27 10:16:59
一、基本类型和引用类型 ECMAScipt变量可能分为两种数据类型:基本类型和引用类型。 基本类型:指简单的数据段;包括Undefined、Null、Boolean、Number、String;可以操作保存在变量中值(栈内存),所以称为按值访问;不能添加属性。 引用类型:可能由多个值构成的对象;包括Arry、Object等;js不允许直接操作对象的内存(堆内存)空间,所以成为按引用访问;可以动态得添加/改变/删除引用类型值的属性和方法。 1.复制 1 var a=5; 2 var b=a; 3 console.log(a);//5 4 console.log(b);//5 5 a=3; 6 console.log(a);//3 7 console.log(b);//5 8 var arrA=[1,2,3]; 9 var arrB=arrA; 10 console.log(arrA);//[1,2,3] 11 console.log(arrB);//[1,2,3] 12 arrA[0]='x'; 13 console.log(arrA);//['x',2,3] 14 console.log(arrB);//['x',2,3] 上述代码中a、b为基本数据类型,arrA、arrB为引用类型。可以看出首先定义并初始化了变量a为5,再定义变量b,此时打印出来a和b都是5;改变a的值为3

.NET中class和struct的区别

♀尐吖头ヾ 提交于 2019-12-27 09:19:31
  1、引言   提起class和struct,我们首先的感觉是语法几乎相同,待遇却天壤之别。历史将接力棒由面向过程编程传到面向对象编程,class和struct也背负着各自的命运前行。在我认为,struct英雄迟暮,class天下独行,最本质的区别是class是引用类型,而struct是值类型,它们在内存中的分配情况有所区别。由此产生的一系列差异性,本文将做以全面讨论。    2、基本概念   2.1、什么是class?    class(类)是面向对象编程的基本概念,是一种自定义数据结构类型,通常包含字段、属性、方法、属性、构造函数、索引器、操作符等。因为是基本的概 念,所以不必在此详细描述,读者可以查询相关概念了解。我们重点强调的是.NET中,所有的类都最终继承自System.Object类,因此是一种引用 类型,也就是说,new一个类的实例时,对象保存了该实例实际数据的引用地址,而对象的值保存在托管堆(managed heap)中。   2.2、什么是struct?   struct(结构)是一种值类型,用于将一组相关的信息变量组织为一个单一的变量实体 。所有的结构都继承自System.ValueType类,因此是一种值类型,也就是说,struct实例分配在线程的堆栈(stack)上,它本身存储了值,而不包含指向该值的指针。所以在使用struct时,我们可以将其当作int

unity(2)笔记07-C#基础:数据类型,值类型,引用类型,值传递,引用传递,ref,out,拆装箱,string特性,StringBuilder,枚举

烈酒焚心 提交于 2019-12-27 05:36:11
av28779788?p=79视频学习笔记 当前为-->第二部分:C#基础 数据类型 数据类型 类型分类 类型归属 内存分配 内存 分配 栈区存放方法(调用时出生,调用结束时销毁);方法中的值类型变量(局部变量);引用类型变量和它的引用,实际数据存放在堆区. 局部变量(值类型/引用类型)存储位置: 值类型:变量本身在栈中,值(数据)在栈中 引用类型:变量本身在栈中,变量的值存储实际数据的内存地址(引用),内存地址(引用)的值即实际数据存在堆中. 二者之间最大的区别 值类型变量有 两个元素 :变量本身,变量的值:数据; 引用类型变量有 三个元素 :变量本身,变量的值:内存地址(引用);内存地址的值:数据 下图显示了方法内部中,局部变量存储在何处(栈区还是堆区): 以下示例区分值类型和引用类型的特点: 以下示例了值传递,按引用传递,值类型使用ref按引用传递,值类型使用out按引用传递参数: tryParse方法(使用out参数的例子) 我们可以用tryParse方法试着将1个字符串转换为数值. 如果成功返回true,且把转换成功的数值传递到out参数中; 如果失败则返回false,此时out参数里值为0 string赋值字符串常量,系统会存到字符串池中: object对象: 注意:以下是 浪费资源的代码示例 ,循环多少次,就会产生多少次字符串常量(后果是垃圾收藏器GC会最终销毁垃圾

JS学习笔记——对象引用

十年热恋 提交于 2019-12-25 18:29:48
  今天看学习视频,温习了这部分知识,特此记录下来。   JS中的数据类型分为 基本类型 和 引用类型 ,基本类型有String、Number、Boolean、Null和Undefined,引用类型有Object、Array、Data、RegExp、Function等。基本类型的值是简单的数据段,引用类型的值指的是多个值构成的对象。 1 num1 = 10 2 num2 = num1 3 console.log(num2) // 10 4 num2 = 30 5 console.log(num2) // 30 6 console.log(num1) // 10   上述代码中,num1的值为10,在给num2赋值的时候,相当于拷贝了num1的副本然后赋值给了它,并且 num1和num2可以参加任何操作而互相不影响。 在看下面一段代码: 1 var arr1 = [1, 2, 3] 2 var arr2 = arr1 3 arr1.push(4) 4 console.log(arr2) // [1, 2, 3, 4] 5 console.log(arr1) // [1, 2, 3, 4]   可以看出从一个变量向另一个变量赋值引用类型的值,同样还是会将存储在变量对象中的值复制一份放到新变量分配的空间中,不同的是,复制的这个副本是一个 指针 ,并不是具体的对象,

C#内存管理和垃圾回收机制

淺唱寂寞╮ 提交于 2019-12-25 11:03:38
数据类型 垃圾回收机制 一、数据类型 C#中的数据类型分为 值类型 (Value type) 和 引用类型(reference type) , 值 类 型: 所有的值类型都集成自 System.ValueType 上,除非加声明?否则不可为null,保存在 堆栈( Stack,先进后出 ) 上,常见的值类型有:整形、浮点型、bool、枚举等。 引用类型: 所有的引用类型都继承自System.Object 上,引用类型保存在 托管堆(Head,先进先出) 上,常见的类型有:数组、字符串、接口、委托、object等。 拆箱和装箱:引用类型和值类型的相互转换叫做拆装箱操作。 拆箱: 拆箱就是将一个引用型对象转换成任意值型!比如: int i=0; System.Object obj=i; int j=(int)obj; 装箱: 装箱就是隐式的将一个值型转换为引用型对象。比如: int i=0; Syste.Object obj=i; 二、垃圾回收机制 GC   1、简介 C#中和Java一样是一种系统自动回收释放资源的语言,在C#环境中通过 GC(Garbage Collect)进行系统资源回收,在数据基本类型中介绍到,C#数据类型分为引用类型和值类型, 值类型保存在Stack上,随着函数的执行作用域执行完毕而自动出栈,所以这一类型的资源不是GC所关心 对象

Equals 和 == 的区别--转

懵懂的女人 提交于 2019-12-25 06:53:24
在比较Equals 和 ==的区别前。我们先来了解下相关的知识 C#数据类型 1、值类型 值类型有:   值类型包括:简单类型、结构类型、枚举类型。   byte(1)、sbyte(1)、short(2)、ushort(2)、int(4)、uint(4)、long(8)、ulong(8)、float(4)、double(8)、decimal(8)、char、bool、枚举、结构。   上述中括号中的数字表示字节数,byte、ushort、uint、ulong 为无符号类型(没有负数),顺便说一下 sbyte 是有符号的字节。 2、引用类型   引用类型有:对象(Object)类型、类类型、接口、代表元、字符串类型、数组。 new 运算符 在 C# 中, new 关键字可用作运算符、修饰符或约束。 1、 new 运算符   用于创建对象和调用构造函数。 2、new 修饰符   用于向基类成员隐藏继承成员。 3、new 约束   用于在泛型声明中约束可能用作类型参数的参数的类型。 需注意一点:凡是用new运算符就会在堆内存中开辟空间存放引用(引用地址存放在栈上)对象的值 == 和 Equals 的区别   1. == 是一个运算符。   2.Equals则是string对象的方法,可以.(点)出来。 我们比较无非就是这两种 1、基本数据类型比较 2、引用对象比较 1、基本数据类型比较

js学习笔记2

拟墨画扇 提交于 2019-12-25 00:24:04
  js中不存在块级作用域。即循环内部定义的变量在循环外也可以访问。   do-while 循环是后测试循环。while循环和for循环是前测试循环。switch语句在比较值(case:后的表达式)的时候用的是全等操作符(===)。   在函数中 return 之后的语句不会被执行。js中函数不介意传递进来多少个参数,也不在乎参数的类型,多传了不影响,少传了默认为 undefined。   js 的函数不存在函数重载,如果定义了两个同名的函数则名字只属于后定义的函数。只能给引用类型动态的添加属性,基本类型不能这么做。   变量的赋值   基本类型赋值会在变量对象上创建一个新值,和之前的值不会相互印影响.   引用类型赋值传递的是指针,将一个引用类型赋值给另一个引用类型时,他们指向的是堆中的同一个对象,对这个对象的修改会相互影响。   函数中参数的传递都是值传递,但是参数传入引用类型的时候如果不对参数重新进行赋值则会对函数外部传入的对象产生影响(恰恰可以说明是值传递而不是传地址)。因为指向的是堆中的同一个对象。   执行环境和作用域    一个执行环境的代码执行完毕之后会执行环境会销毁,其中对应的变量和函数也会销毁。   每个函数都有自己的执行环境,当执行流进入下一个函数时,函数的环境会被推入到一个环境域中。   作用域链:内部环境可以通过作用域链访问所有的外部环境。  

java中的数据类型

一曲冷凌霜 提交于 2019-12-24 15:03:49
简要: 在 java 中,我们知道有两种数据类型,一种是基本类型也叫原始数据类型( primitive types ),另一种是引用类型( reference types ),引用类型指向了不同的对象。本文我们主要讨论 Java 中 强引用、软引用、弱引用、虚引用四种引用有什么区别?同时他们分别适用的场景是什么? 基本概念 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(reachable)状态,程序才能使用它。从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用 不同的引用类型,主要体现的是对象不同的可达性(reachable)状态和对垃圾收集的影响。 强引用(“Strong” Reference) 我们最常见的普通对象引用都是强引用,此时只要引用指向了一个对象,那么该对象就是处于“活着”,垃圾收集器不会去处操作这些对象。对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显式地将相应(强)引用赋值为 null,此时就可以被垃圾收集器回收。 当内存空间不足, Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。 ps