引用类型

JUC 中的 Atomic 原子类总结

∥☆過路亽.° 提交于 2020-01-10 00:11:16
1 Atomic 原子类介绍 Atomic 翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。 所以,所谓原子类说简单点就是具有原子/原子操作特征的类。 并发包 java.util.concurrent 的原子类都存放在 java.util.concurrent.atomic 下,如下图所示。 根据操作的数据类型,可以将JUC包中的原子类分为4类 基本类型 使用原子的方式更新基本类型 AtomicInteger:整型原子类 AtomicLong:长整型原子类 AtomicBoolean :布尔型原子类 数组类型 使用原子的方式更新数组里的某个元素 AtomicIntegerArray:整型数组原子类 AtomicLongArray:长整型数组原子类 AtomicReferenceArray :引用类型数组原子类 引用类型 AtomicReference:引用类型原子类 AtomicReferenceFieldUpdater:原子更新引用类型里的字段 AtomicMarkableReference :原子更新带有标记位的引用类型 对象的属性修改类型 AtomicIntegerFieldUpdater

JS中的传值和传址

妖精的绣舞 提交于 2020-01-09 13:20:04
基本类型值和引用类型值 首先来说一下JS中的数据类型:基本类型值和引用类型值。 基本类型值 :就是简单的数据段。 引用类型值 :指那些可能由多个值构成的对象。 Null,Undefined,Boolean,String,Number ,这五个都是基本类型,都是按值访问的,因为可以直接操作保存在变量中的实际的值。 而引用类型值是存在内存中的对象。而js不允许直接访问内存中的位置。所以你 在操作对象时,是在操作对象的引用而不是实际的对象 。 复制变量值 现在再来说一下复制变量值: 复制基本类型值示例 : var num1 = 5 ; var num2 = num1 ; 如果对于基本类型值,复制变量值,会生成一个新的值,这两个是完全独立的。你可以对它们进行任何操作而不会互相影响。 复制引用类型值示例: var obj1 = new Object ( ) ; var obj2 = obj1 ; obj1 . name = 'mogu' ; console . log ( obj2 . name ) ; //mogu 复制引用类型值,复制的其实是引用,变量 obj1 和 obj2 引用的都是同一个对象,所以你对任一变量进行操作,另一个变量的值也会变化。 综上 :传值就是把自己的值传给另一个变量,但是大家相互独立,互不影响,对其中一个做任何操作都不会影响另一个变量的值。 传址就是把自己的‘地址

JVM性能优化一些概念简介

不羁岁月 提交于 2020-01-09 09:49:48
转自: https://www.iteye.com/blog/pengjiaheng-518623 https://www.iteye.com/blog/pengjiaheng-519471 数据类型 Java虚拟机中,数据类型可以分为两类: 基本类型 和 引用类型 。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。 基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress 引用类型包括: 类类型 , 接口类型 和 数组 。 堆与栈 堆和栈是程序运行的关键,很有必要把他们的关系说清楚。 栈是运行时的单位,而堆是存储的单位 。 栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;堆解决的是数据存储的问题,即数据怎么放、放在哪儿。 在Java中一个线程就会相应有一个线程栈与之对应,这点很容易理解,因为不同的线程执行逻辑有所不同,因此需要一个独立的线程栈。而堆则是所有线程共享的。栈因为是运行单位,因此里面存储的信息都是跟当前线程(或程序)相关信息的。包括局部变量、程序运行状态、方法返回值等等;而堆只负责存储对象信息。 为什么要把堆和栈区分出来呢?栈中不是也可以存储数据吗 ? 第一

值类型和引用类型

二次信任 提交于 2020-01-08 05:46:02
1***、C#中有两种类型: 值类型和引用类型: 值类型的变量直接包含他们的数据,而引用类型的变量存储 引用类型存储对他们的数据的引用,后者称为对象: 简单说:值类型直接存储其值,引用类型存储对值得引用.引用类型分为引用和引用的对象。 2***、 值类型:简单类型、枚举、结构 引用类型: 类类型、接口类型、数组类型和委托类型 3***、值类型与引用类型的内存存储 单纯的说值类型存储在栈上,引用类型存储在托管堆上是不对的。 4***、区别: 1、 托管堆: 同步块和方法表, x,y,托管堆上的需要GC来回收 线程堆栈: 没有同步块和方法表 2、 值类型赋值是重新创建一个副本 而引用类型的赋值是共享同一块内存(副本),是指向同一块内存(引用类型的名字相当于指向操作)。只是复制引用而不复制被引用识别的对象。(“引用”和“引用的对象”) 3、 值类型与引用类型的不同之处就在于值类型的变量直接包括他们的数据,而引用类型的变量把references存储到他们的数据库(Objects)中。 4、 所有的值类型从Object中继承来的。任何类型都不能由值类型派生而来,因此,值类型是封闭式的。 5***什么时候使用值类型 1)当类型是一个十分简单的类型,其中没有成员会修改类型的任何实例字段 2)类型不需要从其他任何类型继承 3)类型不会派生出其他任何类型 4)类型的实例较小 5

C#引用类型和值类型的区别

╄→гoц情女王★ 提交于 2020-01-08 01:26:24
1***、C#中有两种类型: 值类型和引用类型: 值类型的变量直接包含他们的数据,而引用类型的变量存储 引用类型存储对他们的数据的引用,后者称为对象: 简单说:值类型直接存储其值,引用类型存储对值得引用.引用类型分为引用和引用的对象。 2***、 值类型:简单类型、枚举、结构 引用类型: 类类型、接口类型、数组类型和委托类型 3***、值类型与引用类型的内存存储 单纯的说值类型存储在栈上,引用类型存储在托管堆上是不对的。 4***、区别: 1、 托管堆: 同步块和方法表, x,y,托管堆上的需要GC来回收 线程堆栈: 没有同步块和方法表 2、 值类型赋值是重新创建一个副本 而引用类型的赋值是共享同一块内存(副本),是指向同一块内存(引用类型的名字相当于指向操作)。只是复制引用而不复制被引用识别的对象。(“引用”和“引用的对象”) 3、 值类型与引用类型的不同之处就在于值类型的变量直接包括他们的数据,而引用类型的变量把references存储到他们的数据库(Objects)中。 4、 所有的值类型从Object中继承来的。任何类型都不能由值类型派生而来,因此,值类型是封闭式的。 5***什么时候使用值类型 1)当类型是一个十分简单的类型,其中没有成员会修改类型的任何实例字段 2)类型不需要从其他任何类型继承 3)类型不会派生出其他任何类型 4)类型的实例较小 5

java入门篇4 --- 引用类型

江枫思渺然 提交于 2020-01-07 05:12:52
1.String字符串 我们常用的字符串属于引用类型,它可以包含0至n个字符,String使用双引号,字符串的拼接也可以使用+ public class HelloWorld { public static void main(String[] args) { String s = "我爱中国"; String s1 = "i " + "love " + "china"; String s2 = null; // String s3; // Error:(9, 28) java: 可能尚未初始化变量s3 System.out.println(s); // 我爱中国 System.out.println(s2); // null System.out.println(s1); // i love china }} 字符串不可变,如果进行重新赋值,那么变量就会指向新的内存 对于字符串来讲,可以将将其赋予null,注意null跟“”不一样,后者是变量指向“”这个字符串,另外,如果字符串不进行赋值就调用,就会报错 字符串也有内部命令可以进行拼接字符串,格式化字符串,例如: public class HelloWorld { public static void main(String[] args) { String s = "我爱".concat("中国"); System.out

Java并发编程---原子操作CAS

≯℡__Kan透↙ 提交于 2020-01-07 01:25:33
实现并发操作的方法有两种:一种是使用锁(Synchronized和Lock),另外一种是使用原子操作(CAS) Synchronized基于阻塞的锁机制可能会带来的问题: a. 被阻塞的线程优先级很高 b.拿到锁的线程一直不释放锁怎么办? c.大量的竞争消耗cpu,同时带来死锁或者其他安全问题 基于上述问题,提出了CAS原子操作 a.CAS原理:利用现代处理器都支持的CAS指令,循环这个指令,直到成功为止 b.CAS(Compare And Swap) : 指令级别上保证这是一个原子操作 c.与CAS相关的三个运算符:一个内存地址V,一个期望值A,一个新值B 基本思路:如果地址V上的值和期望的值A相等,就给地址V赋新值B,如果不是,不做任何操作。 (在(死循环)循环中不断进行CAS操作) d.CAS也会带来一定的问题: 1)ABA问题(A–>B–>A):当第一次取内存地址V时,取到了A的值,可当它要执行CAS操作之前,已经有一个线程对A的值改为B后,再 改为A,这时候的值虽然一样,不过内容已经有过更改。(举例:在现实生活中,你放在座子上的以一杯水被同事喝完,又重新倒满一杯放在那里。很明显,它虽然还是那杯满着的水,可性质上却完全不一样了。) 解决方法:可以通过版本号解决 A1—>B2---->A3 (类似于乐观锁,大多是基于数据版本( Version )记录机制实现。) 2)开销问题

C#语法——委托,架构的血液

不问归期 提交于 2020-01-06 18:18:30
本篇文章主要介绍委托的应用。 委托是大家最常见的语法了,但会用与精通之间的差别是巨大的。 一个程序员如果不能精通委托,那么,他永远无法成为高级程序员。 所以,让我们把委托刻到血液里吧。 这样,你才能称为[Developer]。 委托的定义 什么是委托? 委托实际上是一种类型,是一种引用类型。 微软用delegate关键字来声明委托,delegate与int,string,double等关键字一样。都是声明用的。 下面先看下声明代码,这里声明了两个委托。 1 2 public delegate void TestDelegate(string message); public delegate int TestDelegate(MyType m, long num); delegate既然是关键字,和int,string一样,那么,为什么delegate后又跟了一个void或者int呢? 如果他们是同等地位的关键字,为什么可以一起使用呢? 很简单,我们把delegate后面的 【void TestDelegate(string message)】理解为一个变量,是不是就清晰明了了一些。 我们把delegate关键字理解为,是用来专门来定义这种复杂的变量的。而这种复杂的变量可以包含一个返回值和任意数目任意类型的传入参数。 有没有感觉,这个复杂的变量特别像一个函数的定义。 没错,官方定义

关于js的原型和原型链

余生长醉 提交于 2020-01-06 15:27:00
先要知道为什么要有原型和原型链,他解决了什么问题: JS引入原型来更好的模仿类的功能,而原型链则用于实现继承。 其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。 什么是原型: JS以引用类型数据特性为基础,通过为构造函数自动创建prototype对象属性,实现类和继承,这个自动创建的prototype就是原型,也叫原型对象。 构造函数、原型和实例的关系 : 每个 构造函数(constructor )都有一个 原型对象(prototype) ,原型对象都包含一个指向构造函数的指针,而实例都包含一个 指向原型对象的内部指针( proto ) 。 什么是原型链: 假如我们 让原型对象等于另一个类型的实例(这是一种通过原型链实现继承的方法) ,结果会怎么样呢? 显然,此时的原型对象将包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数的指针。假如另一个原型又是另一个类型的实例,那么上述关系依然成立,如此层层递进,就构成了实例与原型的链条, 而链条的顶端就是Object,也就是说他们最初都继承自Object 。这就是所谓原型链的基本概念。 原型链原理图: 代码部分: function Person(name = 'bob', ability = ['code', 'dance']) { this.name = name; this.ability

基本数据类型和引用类型

旧城冷巷雨未停 提交于 2020-01-06 03:56:29
javascript的变量是松散类型的,只是在特定的时间用于保存特定值的一个名字。变量的值及其数据类型可以在脚本的生命周期内改变。 数据类型包括:1.基本类型值,简单的数据段;2.引用类型值,由多个值构成的对象。 1.基本类型值 Undefined,Null,Boolean,Number,String。这五种变量是按值访问的,因为可以操作保存在变量中的实际的值。 2.引用类型值 是保存在内存中的对象,javascript不允许直接访问内存中的位置,也就是不能直接操作对象的内存空间。在操作对象的时候,实际上是在操作对象的引用。 3.动态的属性 对于引用类型的值,我们可以为其添加或删除其属性和方法,但是不能给基本类型的值添加属性,尽管不会导致任何错误。 4.复制变量值 基本类型:从一个变量向拎一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上。新变量只是一个副本,这两个变量可以参与任何操作而不会相互影响。 引用类型:将存储在变量对象中的值复制一份放到为新变量分配的存储空间中,这个值的副本是一个指针,这个指针指向存储在堆中的一个对象,这两个变量实际上将引用同一个对象。 5.传递参数 所有函数的参数都是按值传递的,基本类型值的传递和基本类型变量的复制一样,而引用类型值的传递和引用类型变量的复制一样。 访问变量有按值访问和按引用访问两种方式