当前位置: 首页 > 面试题库 >

对不稳定类和原子类有疑问吗?

卫嘉谊
2023-03-14
问题内容

我要通过Java线程书。我碰到了这个说法

声明1:- “易失性变量只能安全地用于单次装载或存储操作,不能应用于长期或双重变量。这些限制使得易失性变量的使用不常见”

我没有明白单次加载或存储操作在这里意味着什么?为什么挥发性不能应用于长期或双重变量?

声明2:-
“易失性整数不能与 运算符一起使用,因为 运算符包含多条指令。AtomicInteger类具有一种方法,该方法允许以原子方式递增所保存的整数。”

为什么挥发性整数不能与++运算符一起使用,以及AtomicInteger如何处理它?


问题答案:

声明1:-“易失性变量只能安全地用于单次装载或存储操作,不能应用于长期或双重变量。这些限制使得易失性变量的使用不常见”

什么?!我认为这完全是错误的。也许您的书已经过时了。

声明2:-“易失性整数不能与 运算符一起使用,因为 运算符包含多条指令。AtomicInteger类具有一种方法,该方法允许以原子方式递增所保存的整数。”

确切地说。++运算符实际上会转换为这样的机器代码(类似于Java的伪代码):

sync_CPU_caches();
int processorRegister = variable;
processorRegister = processorRegister + 1;
variable = processorRegister;
sync_CPU_caches();

这不是线程安全的,因为即使它具有内存屏障,并且可以原子地读取和原子地写入,也不能保证您不会在中间获得线程切换,并且处理器寄存器是CPU内核本地的(将其视为CPU内核内部的“局部变量”)。但是an
AtomicInteger是线程安全的-它可能是使用特殊的机器代码指令(例如比较和交换)实现的。



 类似资料:
  • 官方文档:https://docs.oracle.com/en/database/oracle/oracle-database/19... 图片: number(m,n)里,m是包括整数和小数部分的总位数吧,如果总位数限制为2,那小数位数限制为7有什么意义呢? 如果红框的值是0.9999912,那stored as的值是多少?

  • 既然这个对象(在标题中说明)可以调用子类中的重写方法,为什么它不能调用子类的其他方法?我需要尽可能详细的回答,比如内存组织,JVM中的内部逻辑等。 下面的代码会让你清楚地理解我的问题。

  • 问题内容: 我正在尝试学习可变/不可变的类,而我遇到了这篇文章 提供的部分答案是: 如果要强制不变性,则不能有子类。例如,请参见java.lang.String,由于这个原因,它是最终类:为了防止人们将String子类化以使其可变。 好的,我了解, 但是 ,您将如何处理此问题。假设您的任务是创建3个Employee类,Accountant,ITDepartment和QualityAssurance

  • 原子操作 是个不可分割的操作。 在系统的所有线程中,你是不可能观察到原子操作完成了一半这种情况的; 它要么就是做了,要么就是没做,只有这两种可能。 如果从对象读取值的加载操作是 原子 的,而且对这个对象的所有修改操作也是 原子 的, 那么加载操作得到的值要么是对象的初始值,要么是某次修改操作存入的值。 另一方面,非原子操作可能会被另一个线程观察到只完成一半。 如果这个操作是一个存储操作,那么其他线

  • 无法使用下面的行从子类访问方法, 假设我在子类中有一个方法,而父类中没有相同的方法。在这种情况下,我们无法使用上述代码行访问子类方法print()。但是请注意,如果我们在父类中有相同的方法,那么我们可以使用上面的代码访问它。 可能没有这样的现实生活场景,但试图理解为什么我无法访问子类使用类型为父的子对象,如果我们没有在父类中定义相同的方法。 示例代码如下: 更多解释——如果我在父类中定义了方法,那

  • 我现在正在学习Java类。 我有班主任。从Person我有两个子类,父亲和母亲。一个父亲可以有三个孩子(孩子1、孩子2、孩子3)。现在我想与孩子的父亲共同接触。我怎么能那样做? 我当前的代码: 班级人物 班级父亲 我的main。java 我创建一个父亲和一个人,并将其分配给子1。 现在,我想通过p1得到孩子1的父亲的名字。我怎么能那样做?