当前位置: 首页 > 知识库问答 >
问题:

Java原子特性与有效的Java摘录[重复]

卢俭
2023-03-14

如果int(integer)类型的变量在Java中本质上是原子的,那么为什么我们在示例中看到整数值的不一致状态:https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html

语言规范保证,除非变量类型为long或double,否则读取或写入变量是原子的[JLS,17.4.7]。换句话说,读取long或double以外的变量可以保证返回某个线程存储到该变量中的值,即使多个线程并发地修改变量而不同步。

以上项目与我相矛盾。

共有2个答案

张敏达
2023-03-14

读取/写入int是单原子操作:

int a = 10; // writing
doSomething(a); // reading

另一方面,递增和递减语句由多个操作组成:

a++;

相当于:

a = a + 1; // reading and writing

a可以在读取第二个a之后,以及将总数写入第一个a之前进行更改。

扈运浩
2023-03-14

您的错误是将单个操作(如读取值和写入值)等同于需要多次操作的递增操作。

您链接到的示例包含递增和递减int变量的示例。这些操作看起来像代码中的一个操作,但实际上是幕后的两个操作。要递增或递减,您必须读取值,更改它,然后写入值。

这些操作必须同步才是线程安全的,因为它们由多个操作组成,如果中断,由于竞争条件,这些操作将导致不正确的值。

即使单个读或写操作本身是一致的,一组多个操作也需要同步以保持一致性。

 类似资料:
  • 这是关于类可以实现的比较契约。 除非您愿意放弃面向对象抽象的好处,否则无法在保留compareTo契约的同时使用新的值组件扩展可实例化类。同样的解决方法也适用。如果你想给实现Comparable的类添加一个值组件,不要扩展它;编写一个不相关的类,其中包含第一个类的实例。然后提供一个返回该实例的“视图”方法。这使您可以在第二个类上实现您喜欢的任何compareTo方法,同时允许其客户端在需要时将第二

  • 本文向大家介绍MySQL8.0 DDL原子性特性及实现原理,包括了MySQL8.0 DDL原子性特性及实现原理的使用技巧和注意事项,需要的朋友参考一下 1. DDL原子性概述 8.0之前并没有统一的数据字典dd,server层和引擎层各有一套元数据,sever层的元数据包括(.frm,.opt,.par,.trg等),用于存储表定义,分区表定义,触发器定义等信息;innodb层也有自己一套元数据,

  • 附录B:【原理】进程的属性与特征解析 操作系统负责进程管理,即从程序加载到运行结束的全过程,这个程序运行过程将经历从“出生”到“死亡”的完整“生命”历程。所谓“进程”就是指这个程序运行的整个执行过程。为了记录、描述和管理程序执行的动态变化过程,需要有一个数据结构,这就是进程控制块。进程与进程控制块是一一对应的。为此,ucore需要建立合适的进程控制块数据结构,并基于进程控制块来完成对进程的管理。

  • 问题内容: 基本上,我希望每10毫秒调用一次函数。 如何在Java中实现? 问题答案: 您可能想看看Timer。

  • 问题内容: 我试图弄清楚当我们使用nio FileChannel和normal FileInputStream/FileOuputStream来读写文件到文件系统时,性能(或优势)是否存在任何差异。我观察到,在我的机器上,两者的性能都相同,而且FileChannel速度也慢了很多倍。我能否请你比较这两种方法的更多详细信息。这是我使用的代码,正在测试的文件在左右350MB。如果我不考虑随机访问或其他

  • 我是CSS网格主题的新手,我在网格的帮助下为一个网站创建了一个标题,我创建了带有徽标的标题、导航栏、搜索栏、带有网格的按钮 现在,最后两个属性对齐项目和对齐项目适用于所有ie,用于徽标、导航栏、搜索栏和按钮。我的问题是:我想覆盖这个justify items:center属性,以便仅对navBar的items:flex start进行对齐。那么谁能帮我? 以下是标题的屏幕截图: