原子/易失性/同步如何在内部工作?
以下代码块之间有什么区别?
代码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 …
说这expectSaga
是用于集成测试并且testSaga
用于一般断言是否正确?
实际上,我实际上可以在所有测试中交替使用它们,所以我对何时使用哪个感到有些困惑。
MDN建议“当迭代器的 next() 方法被调用时,生成器函数的主体被执行直到第一个 yield 表达式”,我确实理解这个例子:
function* logGenerator() {
console.log(0);
console.log(1, yield);
console.log(2, yield);
console.log(3, yield);
}
var gen = logGenerator();
gen.next(); // 0
gen.next('pretzel'); // 1 pretzel
gen.next('california'); // 2 california
gen.next('mayonnaise'); // 3 mayonnaise
Run Code Online (Sandbox Code Playgroud)
但是,当我遇到另一个示例时,我感到困惑:
const foo = function*() {
yield 10;
yield 20;
};
const bar = foo();
console.log(bar.next()); // {value: 10, done: false}
Run Code Online (Sandbox Code Playgroud)
如果第一个next()
只在第一次产生之前执行代码,则该值应该是未定义的。它是如何拿起值WITHIN第一的收益呢?我在这里有点困惑。感谢您的帮助。