你们认为这是一个很好的原子操作通用框架吗?您是否也认为对于Java应用程序而言,单个字节代码是原子的,因为使用单个JVM无法一次执行多个字节代码?所以,如果if else有一个单字节代码,那么这个if else指令是原子的吗?
// CAS, Compare and Swap
public abstract class CASOperation<T> {
protected T valueAtStart;
public CASOperation(){
valueAtStart = objectToReview();
}
public void exec(){
synchronized(this){
while(!valueAtStartEqualsTheCurrent()){
valueAtStart = objectToReview();
}
execImp();
}
}
private boolean valueAtStartEqualsTheCurrent() {
if (objectToReview().equals(valueAtStart)){
return true;
} else {
return false;
}
}
abstract protected T objectToReview();
abstract protected void execImp();
Run Code Online (Sandbox Code Playgroud)
它本质上是一个比较和执行框架,因此在检查原始捕捉值没有改变之后,我们执行一些代码块.
我理解AtomicInteger的有效用例,但我对AtomicBoolean如何保证,保证两个动作的原子性i.'改变布尔值'和ii.在以下经常引用的AtomicBoolean变量atomicInitialized的用例中执行'one-time-logic',例如initialize():
if (atomicInitialized.compareAndSet(false, true)) {
initialize();
}
Run Code Online (Sandbox Code Playgroud)
此操作将首先将atomicInitialized设置为true(如果为false),然后执行不安全的intialize().它将保证initialize()仅被调用一次,但是第一个线程完成初始化之后,第二个调用getAndSet()的线程不会被延迟.因此,AtomicBoolean虽然在更新布尔值时提供原子性,但并不真正为整个'if-block'提供原子性,并且必须使用同步/锁定机制来实现完整的原子性.因此,上面经常引用的流行用例并不是真正的原子!!
我想知道Go中的哪些数据类型本质上是线程安全的(如果有的话).
我的假设是int,floats和bools是安全的,而复合类型则不是.
谢谢.
我知道i ++不是一个线程安全的操作.我也理解为什么i ++比i = i + 1更快.在线程安全方面,i = i + 1与i ++有什么不同吗?任何字节码级别的解释都非常有用.
addl, $9, _x(%rip)
Run Code Online (Sandbox Code Playgroud)
_x是一个全局变量.基本上我不确定在这种情况下如何实现添加到全局变量以及在多处理器系统中是否存在与此线路相关的固有竞争条件.
我刚刚在这里读了一个问题,并且阅读了@JB Nizet最评价的答案,我感到困惑......根据答案,在下面的代码中,
private int a=0;
public void foo(){
int temp=35;
a=28;
a=temp;
}
Run Code Online (Sandbox Code Playgroud)
a=28; 是原子操作.
在我在#1读过一些其他的问题和答案,信息是不同的,说a=28;是不是一个原子操作,因为第一右操作数的读操作时发生,则写操作发生,并且每个这两个操作是原子的,但整个任务不是(说实话,这就是我认为它的工作方式).
那怎么样a=temp;?它a=28;与原子性有什么不同?
顺便说一下,我知道volatile和double需要对它们进行原子读/写操作,只是对我上面写的内容感到困惑.
有人可以详细说明吗?
谢谢..
在最新版本的Kafka 0.11.0.0中,Apache团队正在引入幂等生产者和交易.是否可以保证我们想要记录的整组消息(例如100万)只会在最后提交?我想,如果例如生产者放松与经纪人的联系而不能重新安置它,消费者就不会看到消息.可能吗?
我已经读过某些地方,超线程可以使32位int(在32位处理器上)读取和写入非原子,即使它是边界对齐的.任何人都可以解释超线程如何影响这个?
来自数据库事务的ACID属性中的A的原子性表明在数据库上进行的每个事务都像二进制数系统,0或1,全部或全部.
是否有可能在Java或C#等编程语言或任何其他通用语言中实现相同的功能?例如
public static Ticket GetTicket(string filePath) {
counter++;
Application app = new Application(filePath);
.
.
.
Run Code Online (Sandbox Code Playgroud)
可能,我给出了一个不好的例子,但我相信这应该足以给出一个想法.现在,假设我创建Application对象的行抛出异常,那么应用程序的执行将停止,静态变量的状态counter将已经发生变化并且系统状态发生了变化.有没有办法防止在抛出异常之前执行的语句造成损害?
std::pair<Object, OtherObject*> currentData;
void OnCallback()
{
Object object = getObject();
OtherObject* otherObject = new OtherObject();
currentData = std::make_pair(object, otherObject);
}
Run Code Online (Sandbox Code Playgroud)
是make_pair原子?将make_pair字段从其返回值复制或移动到currentData?如果我有另一个线程访问该值currentData,那么访问它时是否有任何潜在currentData的价值不完整?
不幸的是,我没有在标准文档中看到任何相关信息make_pair.
我有一个任务来计算它从某个来源接收到的数据包数量。
每 250 毫秒一个计时器启动读取并将计数输出给用户。在我需要将计数设置回 0 之后。
我担心的是,在读取和显示计数之间,但在我设置计数 = 0 之前,计数在另一个线程中增加了,所以我最终通过将其归零来丢失计数。
我是线程的新手,所以我有多种选择。
我研究过使用 Interlocked 但据我所知它只给我算术运算,我没有选择将变量实际设置为值。
我也在研究 ReaderWriterLockSlim,我需要的是最有效/更少开销的方法来完成,因为有很多数据来了。