首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

死磕 java原子类之终结篇

---- 概览 原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程上下文切换。...在java中提供了很多原子类,笔者在此主要把这些原子类分成四大类。 ?...原子更新对象中的字段,可以更新对象中指定字段名称的字段,这些类主要有: (1)AtomicIntegerFieldUpdater 原子更新对象中的int类型字段。...(3)Unsafe为什么是不安全的? (4)Unsafe的实例怎么获取? (5)Unsafe的CAS操作? (6)Unsafe的阻塞/唤醒操作? (7)Unsafe实例化一个类?...(22)伪共享是什么原因导致的? (23)怎么避免伪共享? (24)消除伪共享在java中的应用? (25)LongAdder的实现方式? (26)LongAdder是怎么消除伪共享的?

44520

JUC 中的 Atomic 原子类

3、只能保证一个共享变量的原子操作。当对多个共享变量操作时,CAS就无法保证操作的原子性,这时就可以用锁,或者把多个共享变量合并成一个共享变量来操作。...为什么使用Atomic类 在JDK1.6之前,synchroized是重量级锁,即操作被锁的变量前就对对象加锁,不管此对象会不会产生资源竞争。这属于悲观锁的一种实现方式。   ...即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。 所以,所谓原子类说简单点就是具有原子/原子操作特征的类。...:引用类型数组原子类 引用类型 AtomicReference:引用类型原子类 AtomicStampedRerence:原子更新引用类型里的字段子类 AtomicMarkableReference...5 对象的属性修改类型原子类 5.1 对象的属性修改类型原子类介绍 如果需要原子更新某个类里的某个字段时,需要用到对象的属性修改类型原子类

42720
您找到你想要的搜索结果了吗?
是的
没有找到

再谈 Python 中的继承(译)

为什么许多关于继承的讨论如此令人沮丧,没有结果?其中一个原因是继承的类型不止一种。正如那篇精彩的文章《为什么继承没有任何意义》所解释的2,继承有有三种类型,不应混为一谈——无论你对继承有什么看法。...如果你像 BarReader 那样使用 register() 方式,接口在运行时不会被验证,它将成为一个(正如文档中所说)「虚拟子类」。...那么,尽管组合应该比继承更好,为什么它看起来如此矫揉造作呢?因为 EmailAddr 和 Mailbox/Forwarder 的关系太密切了,甚至给地址字段命名都很奇怪。...但是记录对象的代码对于所有的实现都是一样的,因此你希望这部分共享代码。 特化在这里不起作用,因为它方向是错的:跟踪仓库是「普通」仓库的特化。因此,我们想要共享的代码会出现在子类中。这里用不上。...热心的读者会马上发现继承的原罪:它将接口的定义与子类共享代码混在一起。如果你想复习一下为什么这很糟糕,回头去看一下《继承没有任何意义》(我在介绍中已经贴过链接了)。

22550

Java 虚拟机:Java对象的内存布局

也就是说,虽然子类无法访问父类的私有实例字段,或者子类的实例字段隐藏了父类的同名实例字段,但是子类的实例还是会为这些父类实例字段分配内存的。 这些字段在内存中的具体分布是怎么样的呢?...以 Integer 类为例,它仅有一个 int 类型的私有字段,占 4 个字节。因此,每一个 Integer 对象的额外内存开销至少是 400%。这也是为什么 Java 要引入基本类型的原因之一。...其二,子类所继承字段的偏移量,需要与父类对应字段的偏移量保持一致。 在具体实现中,Java 虚拟机还会对齐子类字段的起始位置。...class A { long l; int i; } class B extends A { long l; int i; } 我在文中贴了一段代码,里边定义了两个类 A 和 B,其中...Java 8 还引入了一个新的注释 @Contended,用来解决对象字段之间的虚共享(false sharing)问题 [2]。这个注释也会影响到字段的排列。 虚共享是怎么回事呢?

59860

Asp.Net Mvc3.0(MEF依赖注入理论)

Export 特性可修饰类、字段、属性或方法,而 Import 特性可修饰字段、属性或构造函数参数。为了使导入与导出匹配,导入和导出必须具有相同的协定。...导入始终由子类继承。 因此,部件的子类将始终为部件,并具有与其父类相同的导入。通过使用 Export 特性的声明的导出不会由子类继承。 ...所以它不会被目录发现 } [InheritedExport] public class NumThree { [Export] Public IMyData MyData { get;...对于生存期很长的组合容器,创建策略为“非共享”的部件的内存消耗可能会成为问题。 这些非共享部件可以多次创建,并且在容器本身被释放之前将不会得到释放。 ...如果对非共享导出调用此方法,将会从组合容器中移除该导出并将其释放。 仅由移除的导出使用的部件以及树中更深层的诸如此类部件将也会被移除并得到释放。 通过这种方式,不必释放组合窗口本身即可回收资源。

66220

Asp.Net Mvc3.0(MEF依赖注入理论)

Export 特性可修饰类、字段、属性或方法,而 Import 特性可修饰字段、属性或构造函数参数。为了使导入与导出匹配,导入和导出必须具有相同的协定。...导入始终由子类继承。 因此,部件的子类将始终为部件,并具有与其父类相同的导入。通过使用 Export 特性的声明的导出不会由子类继承。 ...所以它不会被目录发现 } [InheritedExport] public class NumThree { [Export] Public IMyData MyData { get;...对于生存期很长的组合容器,创建策略为“非共享”的部件的内存消耗可能会成为问题。 这些非共享部件可以多次创建,并且在容器本身被释放之前将不会得到释放。 ...如果对非共享导出调用此方法,将会从组合容器中移除该导出并将其释放。 仅由移除的导出使用的部件以及树中更深层的诸如此类部件将也会被移除并得到释放。 通过这种方式,不必释放组合窗口本身即可回收资源。

68030

绑定子类的泛型基类,反模式?

基于这个基类的代码重用,使得子类的代码非常简单。这里和普通继承、普通泛型的不同点在于父类在运行时绑定了具体子类的类型。 设计原理     为什么要这样设计?基类为什么不直接使用非泛型的基类呢?...再举一个例子:由于泛型基类运行时绑定了不同的子类,使得它本身的静态字段绑定到最终的子类中的。...这样,当我在EntityBase内声明的静态字段是绑定到各子类中的。...= typeof(T).Name; } 那么这个字段并不是为所有子类共享,而是User.TypeName和Article.TypeName的值不同,分别是"User”和“Article”。...同样的功能,如果你要使用非泛型的基类,由于所有类型共享一个运行时基类,你需要考虑为在基类中为每个具体的类型存储对应的值,例如,使用一个字典存储: public abstract class EntityBase

98050

HotSpot JVM中KlassoopDescoop的作用与关系

而在该Klass对象创建过程中,它同时也会计算该Klass对象对应的Java类所创建的Java对象需要多大内存空间,该计算结果会被保存到Klass对象中的_layout_helper字段中,这样当运行时需要创建...那既然已经有Klass对象了,为什么还要创建个java.lang.Class类型的Java对象呢?...那这个java.lang.Class对象会有什么字段呢? 该对象会包含java.lang.Class类及其父类里所有非静态字段。 还包括其他字段吗? 还包括发起创建该对象对应的Java类中静态字段。...,作为该Java类在Java程序内的代表(该对象会被保存在Klass对象的_java_mirror字段中)。...而这个java.lang.Class对象包含的字段为java.lang.Class类及其父类里所有非静态字段,加上发起创建该java.lang.Class对象对应的Java类中静态字段

58720

Python入门(16)

关于字段,它有两种类型: (1)隶属于类的实例(对象)的字段,被称作实例变量(Instance Variables); (2)从属于某一类本身的字段,被称作类变量(Class Variables)。...字段(Field)的两种类型 —— 类变量与实例变量。 类变量(Class Variable)是共享的(Shared)——它们可以被属于该类的所有实例访问(使用)。...在这种情况下,每个对象都拥有属于它自己的独立字段,也就是说,它们不会被共享,也不会以任何方式与其它不同实例中的相同名称的字段产生关联。 ?...然后,再向这些子类型中添加一些必要的独有的特征。 父类 :SchoolMember ,又被称作基类(Base Class)或是超类(Superclass)。...子类:Teacher 和 Student类会被称作派生类(Derived Classes)或是子类(Subclass)。 (1)、先建一个学校类:SchoolMember,即:父类(基类) ?

83410

打通 Java 任督二脉 —— 并发数据结构的基石

class Thread { ... volatile Object parkBlocker; ... } 当线程被 unpark 唤醒后,这个属性会被置为 null。...// 下面这两个特殊字段可以先不去理解 Node nextWaiter; // 请求的是共享锁还是独占锁 int waitStatus; // 精细状态描述字 } 加锁不成功时,当前的线程就会把自己纳入到等待链表的尾部...而 ReadWriteLock 里面的读锁不是排他锁,它允许多线程同时持有读锁,这是共享锁。共享锁和排他锁是通过 Node 类里面的 nextWaiter 字段区分的。...isShared() { return this.nextWaiter == SHARED; } } 那为什么这个字段没有命名成 mode 或者 type 或者干脆直接叫 shared?...那什么情况下才会抛出异常而导致取消加锁呢,唯一的可能就是 tryAcquire 方法,这个方法是由子类实现的,子类的行为不受 AQS 控制。

59910

【转】Java并发的AQS原理详解

class Thread { ... volatile Object parkBlocker; ... } 复制代码 当线程被 unpark 唤醒后,这个属性会被置为 null。...// 下面这两个特殊字段可以先不去理解 Node nextWaiter; // 请求的是共享锁还是独占锁 int waitStatus; // 精细状态描述字 } 复制代码 加锁不成功时...而 ReadWriteLock 里面的读锁不是排他锁,它允许多线程同时持有读锁,这是共享锁。共享锁和排他锁是通过 Node 类里面的 nextWaiter 字段区分的。...isShared() { return this.nextWaiter == SHARED; } } 复制代码 那为什么这个字段没有命名成 mode 或者 type 或者干脆直接叫 shared...那什么情况下才会抛出异常而导致取消加锁呢,唯一的可能就是 tryAcquire 方法,这个方法是由子类实现的,子类的行为不受 AQS 控制。

81110

C# .NET面试系列二:面向对象

执行顺序:父类的静态构造函数,子类的静态构造函数,父类的静态字段初始化,子类的静态字段初始化,父类的实例构造函数,父类的非静态字段初始化,子类的实例构造函数,子类的非静态字段初始化,方法调用父类的静态构造函数...子类的静态构造函数(如果有):接着执行子类的静态构造函数。同样,静态构造函数只会执行一次,且在类被第一次使用之前执行。父类的静态字段初始化:执行父类的静态字段初始化。静态字段按照声明的顺序初始化。...子类的静态字段初始化:执行子类的静态字段初始化。静态字段按照声明的顺序初始化。父类的实例构造函数:如果创建了父类的实例,执行父类的实例构造函数。实例构造函数用于初始化实例成员,每次创建实例时都会执行。...父类的非静态字段初始化:执行父类的非静态字段初始化。非静态字段按照声明的顺序初始化。子类的实例构造函数:如果创建了子类的实例,执行子类的实例构造函数。...子类的非静态字段初始化:执行子类的非静态字段初始化。非静态字段按照声明的顺序初始化。方法调用:最后,可以调用类中的方法。方法是在实例被创建后才能被调用。

14610

深入探究JVM之类加载与双亲委派机制

在指定类中是否存在符合方法的字段描述符及简单名称所描述的方法和字段。 符号引用中的类、字段、方法的可访问性( private、 protected. public、 )。 是否可被当前类访问。...所以通过子类引用父类静态变量,父子类会被加载,但只有父类会进行初始化。 为什么呢?...#7 // Method java/io/PrintStream.println:(I)V 9: return 关键就是getstatic指令就会触发类的初始化,但是为什么子类不会初始化呢...案例二 调用下面的方法: public void M2(){ SubClaszz[]sca = new SubClaszz[10]; } 执行后可以发现,使用数组,不会触发初始化,但父子类会被加载...这是由于JSP是支持运行时修改的,修改后会丢弃掉之前编译生成的class,并重新生成一个JspClassLoader实例去加载新的class。 以上就是Tomcat为什么要打破双亲委派模型的原因。

44530

Java并发-JUC-AQS-内部属性介绍

子类可以维护其他状态字段,但是只有使用getState()、setState(int)和compareAndSetState(int,int)方法操作的原子更新的int值被跟踪到同步。...内部类 Node static final class Node { // 用于标识节点正在共享模式下等待的标记 static final Node SHARED = new...SHARED与EXCLUSIVE,节点有两种模式 独占模式:每次只能有一个线程能持有资源; 共享模式:允许多个线程同时持有资源; waitStatus: SIGNAL字段,仅接受以下值: SIGNAL...它在被传输之前不会被用作同步队列节点,此时状态将设置为0。...0;对于条件节点,该字段初始化为CONDITION.它是使用CAS修改的,(或者在可能的情况下,使用无条件的volatile写入) nextWaiter: 等待队列的后继节点,或者标识共享模式/独占模式

27520

android阿里面试java基础锦集

2.在加载Dog的class的时候可能会发现其有基类,此时先暂停Dog的加载,转而去加载其基类。所以基类的static域比子类先初始化。...3.载入class文件之后,会创建一个该该类的class对象,所有关于静态初始化的动作会被执行,所以静态初始化只在Class对象首次加载时进行一次。...这块内存控件会被清零,所有实例都被初始化成了默认值,包括基类。 5.执行所有字段定义处的初始化,从基类开始。 6.执行构造器。(在第一行会执行基类的构造器) 4.对象的销毁是按照创建的逆序来进行的。...15.静态属性和静态方法是否可以被继承 非静态属性、静态属性、静态方法 都可以被子类继承,但是不会被覆盖,转为哪个类,调用的就是那个类的东西。也就是说这几个东西不具有多态。...20.解释一下volatile字段### 1.在了解了java内存模型之后,我们知道volatile关键字保证了,某个共享变量改变之后,另一个线程中本地共享变量的副本也会立即刷新。

715110

java 原子类实现原理剖析

对于原子类变量的操作是不会存在并发性问题的,不需要使用synchronized关键字进行并发控制。...CAS非阻塞算法的原理 CAS的全称是Compare-And-Swap(意思是比较后交换):指当两者(这个两者是指线程栈内存中备份的变量值和主内存中共享变量值)进行比较时,如果值相等,则证明共享数据没有被其他线程修改过...,如果被修改过,则该线程会重复执行此操作,直到满足退出循环体的条件为止,这也是为什么线程不会阻塞的原因)。...容易看出 CAS 操作是基于共享数据不会被修改的假设,采用了类似于数据库的 commit-retry 的模式。当同步冲突出现的机会很少时,这种假设能带来较大的性能提升。...static final Unsafe unsafe = Unsafe.getUnsafe(); private volatile int value; //value字段相对

1.2K20

JDK源码解析实战 - AbstractQueuedSynchronizer源码解析

子类可以维护其他状态字段,但是就同步而言,仅跟踪使用方法 getState,setState 和 compareAndSetState 操作的原子更新的int值。...在不同模式下等待的线程们共享相同的FIFO队列。 通常,实现的子类仅支持这些模式之一,但也可以同时出现,比如在ReadWriteLock.仅支持排他模式或共享模式的子类无需定义支持未使用模式的方法....这写方法都是Final的,子类无法重写。 独占模式 ? 共享模式 ?...注意两个状态的区别 state 是锁的状态,int 型,子类继承 AQS 时,都是要根据 state 字段来判断有无得到锁 waitStatus 是节点(Node)的状态 4.3.5.3 数据结构 前驱节点...并且由于条件只能是独占的,因此我们使用特殊值来表示共享模式来保存字段。 ? 5 Condition 接口 JDK5 时提供。

96221

Django 模型继承 BaseModel

当其用作其它模型类的基类时,它的字段会自动添加至子类。...'%(class)s' 用使用了该字段子类的小写类名替换。 '%(app_label)s' 用小写的包含子类的应用名替换。每个安装的应用名必须是唯一的,应用内的每个模型类名也必须是唯一的。...一个代理模型可以继承任意数量的抽象模型类,假如他们 没有 定义任何的模型字段。一个代理模型也可以继承任意数量的代理模型,只需他们共享同一个非抽象父类。...第一个出现的基类(比如 Meta )就是会被使用的那个;举个例子,如果存在多个父类包含 Meta,只有第一个会被使用,其它的都会被忽略。 一般来说,你并不会同时继承多个父类。...这会要求为每个父类模型和公共祖先使用显式的 OneToOneField ,避免与子类自动生成或继承的字段发生冲突: class Piece(models.Model): pass class

2K10

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券