当前位置: 首页 > 面试题库 >

原子执行代码块

黄昊英
2023-03-14
问题内容

您将如何回答以下问题?

Java类的方法包含必须自动执行的代码块。使用适当的伪代码说明如何确保自动执行此代码块

我可以通过制作方法来实现吗..

public final AtomicInteger x = new AtomicInteger(0);

然后确保返回get语句:

x.get()

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

x.getAndIncrement();

问题答案:

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

我知道以下三个有效定义atomic

  1. 与同步中的原子相同:一次只能有一个线程执行代码;
  2. 像ACID中那样是原子的:所有动作/阻止都发生,或没有动作;
  3. 原子不可中断:一旦块开始,就不能被中断,即使通过任务切换也是如此。

第一个可能是您的教授的意思,并且很容易实现(请参见下文)。

第二个(如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三个可以 安全
撤消的操作,并且所有访问都在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);
                }
            }
        }
    }


 类似资料:
  • 主要内容:.NET Core代码执行过程在本章中,我们将了解.NET Core的执行过程,并将其与.NET Framework进行比较。被管理的执行过程包括以下步骤。 选择一个编译器 编译代码成MSIL 将MSIL编译为本地代码 运行代码 注:感觉有点像Java的机制了。 参考下图中的流程 - 1. 选择一个编译器 它是一个多语言执行环境,运行时支持各种数据类型和语言功能。 要获得公共语言运行时提供的好处,必须使用一个或多个定位运行时的

  • 描述 远程代码执行是指注入由漏洞应用解释和执行的代码。这通常由用户提交输入,应用使用它而没有任何类型的处理或验证而导致。 看一下这行代码: $var = $_GET['page']; eval($var); 这里,漏洞应用可能使用 URLindex.php?page=1,但是,如果用于输入了index.php?page=1;phpinfo(),应用就会执行phpinfo函数,并返回其内容。 与

  • 我已经编写了以下代码,并为这个超类创建了对象。 当我检查输出时,如下所示: 我知道只有在初始化类的对象或进行任何静态引用时,才会执行静态块。但在这里,我并没有把这些都带到课堂上。那么为什么我会看到“sub”即sub类的静态块输出?

  • 我试图执行一些php代码行,但似乎没有按要求的顺序执行。以下是一段代码片段:- 当我在函数Get_Val()中返回之前回显该值时,它会显示一组有效参数的正数,这意味着If条件为true,但当我执行代码时,Else部分正在执行。虽然输出是按顺序显示的,但它们并不一致。我希望我已经把问题说清楚了。感谢您的任何帮助。谢谢下面是Get_Val()函数:-

  • 在开发servlet程序时,我遇到了一个问题,我使用了netbeans ide,并使用了glassfish服务器。这是我的索引代码。html文件:- servlet的代码是:- 我认为问题是在解析变量时发生的。。。拜托,谁能帮我??而且索引文件执行得很好,但当我直接点击按钮而不在文本框中键入任何内容时,它会显示正确的输出,但当我输入程序(abc)中指定的用户名和密码时 HTTP状态500-内部服务

  • 讲师:gh0stkey 整理:飞龙 协议:CC BY-NC-SA 4.0 原理 由于开发人员编写源码时,没有针对代码中可执行的特殊函数入口做过滤,导致客户端可以提交恶意构造语句,并交由服务端执行。命令注入攻击中,Web 服务器没有过滤类似system、eval和exec等函数,是该漏洞攻击成功的主要原因。 实例代码 <?php // code-exe.php: $code=@$_GET['code