首页 > 试题广场 >

以下哪种JAVA得变量声明方式可以避免程序在多线程竞争情况下

[不定项选择题]
以下哪种JAVA得变量声明方式可以避免程序在多线程竞争情况下读到不正确的值(  )
  • volatile
  • static volatile
  • synchronized
  • static
synchronized不是修饰变量的 它修饰方法或代码块或对象
发表于 2019-08-24 10:22:21 回复(18)
完全没看到题目说的是 变量声明方式,所以想都没想就选择了synchronized
发表于 2019-10-10 08:55:01 回复(6)
线程安全性比较关键的两个点:内存可见性和操作原子性 如果你不修改值,可以使用private static final int , final可以保证内存可见性语义。对于原生变量,final修饰后不可更改,从而也不存在操作原子性的问题。 如果你只是想单纯地进行赋值,而不进行复合操作,那么可以使用volatile int. volatile可以确保内存可见性,但是无法确保原子性,所以不支持复合操作的线程安全性。 如果你想进行复合操作,可以使用AtomicInteger这个原子类,支持CAS操作,可确保内存可见性和操作原子性。
发表于 2020-02-07 11:42:57 回复(0)
给对static有疑问的伙伴:
static修饰的属性代表该属性是属于类的,线程在使用这个属性的时候是从类中复制拷贝一份到线程工作内存中的,而修改线程内存中的值而后写回到原先的位置就不一定是啥时候了,所以可见性是无法确保的。而volatile则是强制从主内存中获取。
发表于 2021-10-27 22:00:24 回复(0)
volatile不是也有可能值更新混乱嘛...
发表于 2019-09-20 16:45:25 回复(9)

当一个变量定义为 volatile 之后,将具备两种特性:

1.保证此变量对所有的线程的可见性,即当一个线程修改了这个变量的值,volatile 保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新。但普通变量做不到这点,普通变量的值在线程间传递均需要通过主内存(详见:Java内存模型)来完成。

2.禁止指令重排序优化。有volatile修饰的变量,赋值后多执行了一个“load addl $0x0, (%esp)”操作,这个操作相当于一个内存屏障(指令重排序时不能把后面的指令重排序到内存屏障之前的位置),只有一个CPU访问内存时,并不需要内存屏障;(什么是指令重排序:是指CPU采用了允许将多条指令不按程序规定的顺序分开发送给各相应电路单元处理)。

发表于 2020-10-11 16:09:10 回复(0)
题目看两遍 题目看两遍 题目看两遍
发表于 2020-02-04 15:07:07 回复(0)
这题考的是可见性吧。
发表于 2019-10-30 22:04:58 回复(0)
synchronized不能修饰变量  它修饰方法或代码块或对象
发表于 2021-11-03 08:27:48 回复(0)
synchronized不能修饰变量
发表于 2020-08-03 19:07:36 回复(0)
感觉这道题不太严谨,考点是并发三特征,选项又像是在考单例模式,如果要在多线程竞争的情况下读到准确的值,光靠 volatile 也不够啊,加上volatile 也只是保证其他线程能够感知到变量的值会变化,但到底能不能读到修改后的准确的值不一定。
发表于 2020-03-25 17:22:35 回复(0)
AB 一旦被volatile修饰之后,保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。它会保证修改的值会立即被更新到主存中,当有其他线程读取到新值。同时它还禁止指令重排,在java内存模型当中,允许编译器和处理器对指令进行重新排序,但是重排序过程不会影响到单线程程序的执行结果,却会影响到多线程并发执行的正确性。volatile无法保证对变量的操作都是原子性的。
发表于 2022-01-04 11:01:53 回复(0)
线程安全性比较关键的两个点:内存可见性和操作原子性 如果你不修改值,可以使用private static final int , final可以保证内存可见性语义。对于原生变量,final修饰后不可更改,从而也不存在操作原子性的问题。 如果你只是想单纯地进行赋值,而不进行复合操作,那么可以使用volatile int. volatile可以确保内存可见性,但是无法确保原子性,所以不支持复合操作的线程安全性。 如果你想进行复合操作,可以使用AtomicInteger这个原子类,支持CAS操作,可确保内存可见性和操作原子性。
发表于 2021-11-09 14:31:25 回复(0)
volatile是不保证原子性的,我以为就无法保证其线程安全了
发表于 2021-06-27 13:26:20 回复(0)
volatie关键字我刚看了不久,它是不能保证线程安全的,只有在特定情况下才能保证线程安全,到这就又变成了线程安全了。。。比较典型的案例就是i++这个非原子操作使用volatie关键字就保证不了线程安全,故,此题无解🤣🤣
编辑于 2021-05-06 14:41:04 回复(0)
估计有些人没看到修饰变量直接选了synchrnized
发表于 2020-10-05 21:34:59 回复(0)
注意题目是变量声明,不要选synchronized,它是修饰方法或代码块
编辑于 2022-04-06 15:11:47 回复(0)
多看几遍,这里两个坑,一个是问修饰变量,一个是问读不出错。
发表于 2021-01-07 18:34:32 回复(0)
static为什么不行
发表于 2020-09-05 11:43:36 回复(0)
synchronized只能修饰类,方法,忽略了不能修饰变量了。
发表于 2020-04-27 23:52:25 回复(0)