首页 > 试题广场 >

以下多线程对int型变量x的操作,哪个不需要进行同步()

[单选题]
以下多线程对int型变量x的操作,哪个不需要进行同步()
  • ++x
  • x=y
  • x++
  • x=1
同步是害怕在操作过程的时候被其他线程也进行读取操作,一旦是原子性的操作就不会发生这种情况。
因为一步到位的操作,其他线程不可能在中间干涉。另外三项都有读取、操作两个步骤,而X=1则是原子性操作。
发表于 2016-01-05 20:44:51 回复(12)
前三个都至少需要先读取,再操作,非原子操作。而D的话,直接赋值。
发表于 2015-11-05 17:33:42 回复(1)
ABC不是原子性操作,例如想x++,先获取x的值,自增一,然后再把值赋给x,三步,中间任何一步执行时都可能被其他线程访问或者修改。所以需要同步。
发表于 2015-11-09 19:32:19 回复(7)
做过一些微架构的东西,大家说的都挺好,我从指令集方面说说。
D项通过编译后,应该是:mov 1,eax。x对应寄存器eax,所以是原子操作;
而其他几项,都需要先读取x即load eax,x(比如将x读入eax寄存器中),然后在修改;但是多线程下,其他线程也可以读x啊,所以就存在同步问题了。
对了,同步就是将读取x内存区的地址总线申请独享!
编辑于 2016-08-01 12:24:26 回复(6)
前三个不是原子操作,最后一个直接赋值,为原子操作。
原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为"不可被中断的一个或一系列操作" 。原子操作就是不可再分的操作。在多线程程序中原子操作是一个非常重要的概念,它常常用来实现一些同步机制。由不可分性可知,原子性是拒绝多线程操作的(只有分解为多步操作,多个线程才能对其操作:就像一个盒子里有多个兵乓球,多个人能够从盒子里拿乒乓球;如果盒子只有一个兵乓球,一个人拿的话,其他人就拿不到了;这就是原子性,乒乓球就具有原子性,人就相当于原子)
发表于 2016-06-06 14:05:26 回复(0)
++ x ,  x ++这样的操作在多线程环境下是需要同步的。 因为X86会按三条指令的形式来处理这种语句:从内存中读x的值到寄存器中,对寄存器加1,再把新值写回x所处的内存地址。 而对于x=y这样的操作,从从内存中读取x值和y值都是原子操作的,但是两个合起来就变成非原子操作了,因此也需要同步。 x=1只需将1写入内存一条指令,属于原子操作,因此不需要同步。
发表于 2017-03-23 16:14:03 回复(1)
D
A、B、C选项,一个线程对x的修改都会影响另一个线程对x值的读取
发表于 2015-11-04 19:30:12 回复(0)
x=y
隐含着需要读取y才能赋值给x,存在数据依赖,需要禁止重排序,不然可能有同步问题
发表于 2018-01-01 20:28:58 回复(3)
++ x x ++这样的操作在多线程环境下是需要同步的。因为X86会按三条指令的形式来处理这种语句:从内存中读x的值到寄存器中,对寄存器加1,再把新值写回x所处的内存地址。而对于x=y这样的操作,从从内存中读取x值和y值都是原子操作的,但是两个合起来就变成非原子操作了,因此也需要同步。x=1只需将1写入内存一条指令,属于原子操作,因此不需要同步。
发表于 2017-03-03 22:00:52 回复(0)
原子性操作:一个或某几个操作只能在一个线程执行完之后,另一个线程才能开始执行该操作,也就是说这些操作是不可分割的,线程不能在这些操作上交替执行。
我们对于不具有原子性的操作,我们必须对其进行同步(synchronized、lock等),使得这些操作只能由一个线程执行完后,其他线程才能执行这些操作。
x++与++x,首先,会获取x的值,创建一个临时变量temp,将x+1赋值给temp,随后将temp的值重新赋值给x,涉及读取等多个操作,不是原子性操作,需要同步;
x=y,读取y的值,将这个值赋予x,同样有读取操作莫不是原子性操作。
x=1,直接将1赋予x,是原子性操作。
发表于 2020-04-18 00:06:06 回复(0)
A
发表于 2015-11-04 17:42:19 回复(0)
A:在X86上它包含两个操作:读取y至寄存器,再把该值写入x。读y的值这个操作本身是原子的,把值写入x也是原子的,但是两者合起来不是原子操作,因为它不是不可再分的操作,所以需要进行同步。
B、C:x++和++x这样的操作在多线程环境下是需要同步的。因为X86会按三条指令的形式来处理这种语句:从内存中读x的值到寄存器中,对寄存器加1,再把新值写回x 所处的内存地址。
D:x=1是原子操作,不可再分。因为x是int类型,32位CPU上int占32位,在X86上由硬件直接提供了原子性支持。实际上不管有多少个线程同时执行类似x=1这样的赋值语句,x的值最终还是被赋的值(而不会出现例如某个线程只更新了x的低16位然后被阻塞,另一个线程紧接着又更新了x的低24位然后又被阻塞,从而出现x的值被损坏了的情况)。
发表于 2022-03-09 08:51:50 回复(0)
不需要同步说明这个操作是安全的,前三个操作都有涉及读取操作,这样在多线程中可能因为没有同步导致预期读取的值与实际读取的值不同,只有选项4是固定赋值1,安全。
发表于 2021-12-16 22:08:57 回复(0)
根据直觉就选D
发表于 2021-12-15 14:49:21 回复(0)
x=1;赋值行为,原子操作
发表于 2021-12-12 18:03:08 回复(0)
同步是害怕在操作过程中被其他线程打断,原子操作不需要同步:
i++不是原子操作,因为它的执行要三步:1.读内存到寄存器2.在寄存器中自增3.写回内存
发表于 2020-02-28 09:45:29 回复(0)
原子性:原子(atom)本意是“不能被进一步分割的最小粒子”,原子操作(atomic operation)意为"不可被中断的一个或一系列操作" 。原子操作就是不可再分的操作,即一件事要么做就做到底做完,要么就不做。在多线程程序中原子操作是一个非常重要的概念,它常常用来实现一些同步机制。由不可分性可知,原子性是拒绝多线程操作的(只有分解为多步操作,多个线程才能对其操作)。++ x ,  x ++这样的操作在多线程环境下是需要同步的。 因为这种语句包含三步:从内存中读x的值到寄存器中,对x寄存器加1,再把新值写回x所处的内存地址。 而对于x=y这样的操作,从内存中读取x值和y值都是原子操作的,但是还要把y赋值给x,这两个合起来就变成非原子操作了,因此也需要同步。 x=1只需将1写入内存一条指令,属于原子操作,不需要同步。同步是害怕在操作过程的时候被其他线程也进行读取操作,一旦是原子性的操作就不会发生这种情况。 因为一步到位的操作,其他线程不可能在中间干涉。
编辑于 2019-10-23 17:19:23 回复(0)
只有原子操作才不需要同步,java中的原子操作包括:
1.除long和double之外的基本数据类型的赋值操作
2.所有引用的赋值操作
3.java.concurrent.Atomic.* 包中所有类的一切操作。
发表于 2019-03-21 15:16:46 回复(0)
只有简单的读取、赋值(而且必须是将数字赋值给某个变量,变量之间的相互赋值不是原子操作)才是原子操作。
发表于 2017-04-11 09:14:52 回复(0)
这个没啥意外D直接是赋值操作
编辑于 2023-08-11 14:13:13 回复(0)