首页 > 试题广场 >

以下说法正确的是?

[不定项选择题]
以下说法正确的是:
  • 在并行程度中,当两个并行的线程,在没有任何约束的情况下,访问一个共享变量或者共享对象的一个域,而且至少要有一个操作是写操作,就可能发生数据竞争错误。
  • 原语Compare-and-swap(CAS)是实现无锁数据结构的通用原语。
  • 获得内部锁的唯一途径是:进入这个内部锁保护的同步块或方法。
  • volatile变量具有synchronized的可见性特性,但是不具备原子特性。
  • 减小竞争发生可能性的有效方式是尽可能缩短把持锁的时间
A: 来自Thinking in java:如果你正在写一个变量,它可能接下在将被另一个线程读取,或者正在读取上一个已经被另一个线程写过的变量,那么你必须应用同步,并且,读写线程都必须用相同的监视器锁同步。--由此可以想到,如果多个线程都只读数据,则不会造成竞争错误,因为不会出现读脏数据或者数据不同步问题。
B. 无锁化编程常用方式之一
C. 当线程企图访问临界资源时,先会查看该临界资源当前是否已被加锁,如果没有被加锁,则对该临界资源加锁,并进入该同步块或方法,加锁后,其他线程也就无法访问该临界资源了。所以判定获取了一个内部锁的标准为:进入该同步区域
D. 保证可见性,调用volatile变量时,使用前都会刷新该变量,保证变量的值为最新的。不保证互斥性,所以不具备原子特性
E. 把持锁的时间短了,等待锁的时间也就短了,竞争可能性变小
编辑于 2017-04-01 10:15:11 回复(1)
volatile的作用:1、修饰变量说明这个变量会意想不到地改变,优化器每次用到该变量,值都会重新从内存中读取它。2、进行多线程编程, 多任务环境下各任务间共享的标志应该加volatile.
发表于 2015-08-29 15:24:08 回复(0)
C选项明显有问题!锁都没获得,怎么进入内部锁保护得代码块或者方法!
发表于 2021-11-29 10:56:35 回复(0)
c答案应该错吧   是得先拿到锁才能进入临界区吧,怎么说成进临界区是拿到锁的唯一途径?   
发表于 2015-09-06 05:07:44 回复(3)
C有问题,表达错误
发表于 2020-08-26 15:23:16 回复(0)
d答案volatle能保证原子姓吗?
发表于 2018-10-23 01:07:43 回复(1)
Volatile通过处理器设置读写屏障保证并发的happens before关系。可以算原子。因为x86只支持写读屏障,默认把数据依赖关系的不允许重排序,实质上x86volatile总能被其他线程看到最近更改就是如此
编辑于 2017-12-03 09:40:36 回复(0)
c是正确的 用对象的手法管理🔒 比如cpp的RAII 进入函数 利用对象的构造函数取得🔒 离开函数 对象析构 释放🔒
发表于 2017-03-20 12:52:13 回复(0)
看一下《Java并发编程实战》(Java concurrency in practice)基本上都是书上的内容
发表于 2016-08-13 18:04:27 回复(0)
哪位大神能解释一下C呀?
发表于 2015-09-01 16:30:46 回复(1)
选项A.什么叫数据竞争错误,他们永远不会报错,最多就是数据变化而已,读取的数据会变....难道还会报个error出来?
网上没找到这个概念....太out了
发表于 2015-08-31 10:22:24 回复(3)
volatile的作用就是使它修饰的变量的读写操作都必须在内存中进行, 可以实现变量修改的可见性,不具有原子性。

发表于 2015-08-23 16:14:17 回复(0)
答案到底是多少?查了网上的答案,怎么感觉都是对的呢
发表于 2015-06-08 17:24:28 回复(0)
ABE显然是对的
C不知道。。。。
D的话,还是看语言和体系结构吧,遇到Cache和Out-order的话,C语言的话就错了,但Java的话就还是对的。。

发表于 2015-03-24 20:46:31 回复(3)