财产申报中的含义atomic和nonatomic含义是什么?
@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;
Run Code Online (Sandbox Code Playgroud)
这三者之间的运作区别是什么?
原子/易失性/同步如何在内部工作?
以下代码块之间有什么区别?
代码1
private int counter;
public int getNextUniqueIndex() {
return counter++;
}
Run Code Online (Sandbox Code Playgroud)
代码2
private AtomicInteger counter;
public int getNextUniqueIndex() {
return counter.getAndIncrement();
}
Run Code Online (Sandbox Code Playgroud)
代码3
private volatile int counter;
public int getNextUniqueIndex() {
return counter++;
}
Run Code Online (Sandbox Code Playgroud)
是否volatile以下列方式工作?是
volatile int i = 0;
void incIBy5() {
i += 5;
}
Run Code Online (Sandbox Code Playgroud)
相当于
Integer i = 5;
void incIBy5() {
int temp;
synchronized(i) { temp = i }
synchronized(i) { i = temp + 5 }
}
Run Code Online (Sandbox Code Playgroud)
我认为两个线程不能同时进入同步块...我是对的吗?如果这是真的那么如何atomic.incrementAndGet()工作没有synchronized …
在Effective Java一书中,它指出:
语言规范保证读取或写入变量是原子的,除非变量是类型
long或double[JLS,17.4.7].
"原子"在Java编程或一般编程的上下文中意味着什么?
我有点理解AtomicInteger和其他Atomic变量允许并发访问.在什么情况下这个类通常使用?
一般地,对于int num,num++(或++num),作为读-修改-写操作中,是不是原子.但我经常看到编译器,例如GCC,为它生成以下代码(在这里尝试):
由于第5行对应于num++一条指令,我们可以得出结论,在这种情况下num++ 是原子的吗?
如果是这样,是否意味着如此生成num++可以在并发(多线程)场景中使用而没有任何数据争用的危险(例如,我们不需要制作它,std::atomic<int>并强加相关成本,因为它是无论如何原子)?
UPDATE
请注意,这个问题不是增量是否是原子的(它不是,而且是问题的开头行).它是否可以在特定场景中,即在某些情况下是否可以利用单指令性质来避免lock前缀的开销.而且,作为公认的答案约单处理器的机器,还有部分提到这个答案,在其评论和其他人谈话解释,它可以(尽管不是C或C++).
我知道复合操作i++不是线程安全的,因为它们涉及多个操作.
但是检查引用本身是一个线程安全的操作?
a != a //is this thread-safe
Run Code Online (Sandbox Code Playgroud)
我尝试编程并使用多个线程,但它没有失败.我想我无法在我的机器上模拟比赛.
public class TestThreadSafety {
private Object a = new Object();
public static void main(String[] args) {
final TestThreadSafety instance = new TestThreadSafety();
Thread testingReferenceThread = new Thread(new Runnable() {
@Override
public void run() {
long countOfIterations = 0L;
while(true){
boolean flag = instance.a != instance.a;
if(flag)
System.out.println(countOfIterations + ":" + flag);
countOfIterations++;
}
}
});
Thread updatingReferenceThread = new Thread(new Runnable() {
@Override
public void run() …Run Code Online (Sandbox Code Playgroud) 我明白这std::atomic<>是一个原子对象.但原子到什么程度?根据我的理解,操作可以是原子的.使对象成为原子意味着什么?例如,如果有两个线程同时执行以下代码:
a = a + 12;
Run Code Online (Sandbox Code Playgroud)
然后是整个操作(比方说add_twelve_to(int))原子?或者是变量原子(so operator=())的变化?
如果有两个线程访问全局变量,那么许多教程都说使变量volatile变为阻止编译器将变量缓存在寄存器中,从而无法正确更新.但是,访问共享变量的两个线程是通过互斥锁来调用保护的东西不是吗?但是在这种情况下,在线程锁定和释放互斥锁之间,代码处于一个关键部分,只有那个线程可以访问变量,在这种情况下变量不需要是volatile?
那么多线程程序中volatile的用途/目的是什么?
lazySet和set方法有AtomicInteger什么区别?该文件并没有太多的话要说lazySet:
最终设置为给定值.
似乎存储的值不会立即设置为所需的值,而是计划在将来的某个时间设置.但是,这种方法的实际用途是什么?任何例子?
OpenMP中的原子和关键有什么区别?
我可以做这个
#pragma omp atomic
g_qCount++;
Run Code Online (Sandbox Code Playgroud)
但是不一样
#pragma omp critical
g_qCount++;
Run Code Online (Sandbox Code Playgroud)
?
atomic ×10
java ×5
c++ ×3
concurrency ×3
volatile ×2
assembly ×1
c ×1
c++11 ×1
ios ×1
nonatomic ×1
objective-c ×1
openmp ×1
properties ×1