以原子方式执行代码块
2022-09-02 11:21:28
您如何回答以下问题?
java 类的方法包含必须以原子方式执行的代码块。使用适当的伪代码解释如何确保以原子方式执行此代码块
我会通过制作方法来实现这一点吗.
public final AtomicInteger x = new AtomicInteger(0);
然后确保返回 get 语句:
x.get()
如果我想增加x的值,我会这样做吗?
x.getAndIncrement();
您如何回答以下问题?
java 类的方法包含必须以原子方式执行的代码块。使用适当的伪代码解释如何确保以原子方式执行此代码块
我会通过制作方法来实现这一点吗.
public final AtomicInteger x = new AtomicInteger(0);
然后确保返回 get 语句:
x.get()
如果我想增加x的值,我会这样做吗?
x.getAndIncrement();
答案取决于你对“原子”的定义
我知道有三个有效的定义:atomic
第一个可能是你的教授的意思,它很容易实现(见下文)。
第二个(如ACID中的原子)可以近似。见下文。
第三个在Java中根本无法保证 - 它不提供对不间断所需的“关键部分”原语的访问。幸运的是,对此的需求几乎仅限于操作系统和设备驱动程序。
同步中的原子
这相对简单:只需将代码块包含在同步块中即可。我在下面将其显示为离散块,但还有其他选项:
public void doSomethingQuasiAtomic() {
synchronized (exampleLock) {
// Your code block goes here.
// Only one thread will ever be in this block at a time.
...
}
}
原子,如酸
原子性没有一般情况的解决方案,但它可以使用同步代码进行近似。为此,操作的每个部分都必须是可安全可逆的。ACID
这就是我处理它的方式:
为了便于论证,假设您需要对我们将调用的对象执行一个多部分操作,该操作有三个要执行的操作可以安全地撤消,并且所有对 的访问都在 上同步。exampleObj
example
exampleLock
synchronized(exampleLock) {
boolean actionOneDone=false;
boolean actionTwoDone=false;
boolean actionThreeDone=false;
try {
actionOneDone=doActionOne(exampleObj); // or perhaps exampleObj.doActionOne();
if(actionOneDone) actionTwoDone=doActionTwo(exampleObj);
if(actionTwoDone) actionThreeDone=doActionThree(exampleObj);
} catch (Exception ex) {
// Whatever seems appropriate here.
} finally {
if (! (actionOneDone && actionTwoDone && actionThreeDone)) {
/* At least one part failed. Back out the completed actions in reverse order.
* Note that we never need to reverse action three since if it completed, so did the others.
*/
if (actionTwoDone) {
reverseActionTwo(exampleObj); // or perhaps exampleObj.reverseActionTwo();
}
if (actionOneDone) {
reverseActionOne(exampleObj);
}
}
}
}
我相信预期的答案是这样的:
public class A {
public void foo() {
// .. some code
doSomething(); // the critical part
// .. come code
}
public synchronized void doSomething() { // this is a synchronized method
// the critical code
}
}
的执行不是真正的原子(免责声明:它与原子性有很大不同),但 sync 关键字确保只有一个线程可以进入此方法的执行(在 一个实例上)。我认为这就是他们的意思,而不是原子性。doSomething()
A
这是关于Java中原子性的另一个问题。你可能会在那里找到一些有用的东西。