加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 以原子方式执行代码块

发布时间:2020-12-15 02:51:11 所属栏目:Java 来源:网络整理
导读:你会如何回答以下问题? A method of a java class contains a block of code that must be executed atomically. Explain,using appropriate pseudo-code,how you would ensure that this block of code is executed atomically 我会通过制作方法来实现这一
你会如何回答以下问题?

A method of a java class contains a block of code that must be
executed atomically. Explain,using appropriate pseudo-code,how you
would ensure that this block of code is executed atomically

我会通过制作方法来实现这一点吗?

public final AtomicInteger x = new AtomicInteger(0);

然后确保返回get语句:

x.get()

如果我想增加x的值,我会这样做吗?

x.getAndIncrement();

解决方法

答案取决于你对“原子”的定义

我知道三个有效的原子定义:

>同步中的原子:一次只能有一个线程执行代码;
> ACID中的原子:所有的动作/阻止都会发生,或者都不会发生;
>不间断的原子:一旦块启动,即使通过任务切换也不会中断.

第一个可能是你的教授的意思,而且很容易实现(见下文).

第二个(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中的原子

对于ACID原子性没有通用的解决方案,但它也可以使用同步代码进行近似.为了做到这一点,动作的每个部分必须是安全可逆的.

这就是我接近它的方式:

为了便于论证,假设您需要对我们称之为exampleObj的对象执行多部分操作,您可以执行三个可以安全撤消的操作,并且可以在exampleLock上同步对示例的所有访问.

synchronized(exampleLock) {
        boolean actionOneDone=false;
        boolean actionTwoDone=false;
        boolean actionThreeDone=false;
        try {
            actionOneDone=doActionOne(exampleObj);    // or perhaps exampleObj.doActionOne();
            actionTwoDone=doActionTwo(exampleObj);
            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);
                }
            }
        }
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读