转载

Java 谜题 2:梦境

你有没有从梦中醒来,然后发现你真的还在做梦?如果你醒来,你怎么知道你回到了现实?这个难题实现了该问题的解决方案:当您进入和退出梦想时,您可以计算梦境的递归级别:

<b>package</b> sleep;
 
<b>import</b> dream.Dream;
 
<b>public</b> <b>class</b> Sleeper {
    <b>private</b> <b>int</b> level;
     
    <b>public</b> <b>synchronized</b> <b>int</b> enter(Dream dream) {
        level++;
        <b>try</b> {
            dream.dream(<b>this</b>);
        } <b>finally</b> {
            level--;
        }
        <b>return</b> level;
    }
}

睡眠者开始睡觉并进入梦境(第一级)。他可以在梦里做一个梦,甚至进入更深层次的梦。但当他离开表层的梦时,他再次醒来,所以他应该再次回到零级,对吧?

<b>package</b> sleep;
 
<b>import</b> dream.Dream;
 
<b>public</b> <b>class</b> Main {
    <b>public</b> <b>static</b> <b>void</b> main(String[] args) {
        <b>if</b> (<b>new</b> Sleeper().enter(<b>new</b> Dream()) != 0) {
            <font><i>// The goal is to reach this line</i></font><font>
            System.out.println(</font><font>"Am I still dreaming?"</font><font>);
        }
    }
}
</font>

levels 计数看起来非常安全,所以这似乎是不可能的:

  • 每次进入梦境level都会增加。由于finally阻挡,没有办法离开梦境而不再减少它。
  • synchronized块确保没有其他线程可以同时调用它。从梦的方法返回级别,以确保它在synchronized块内读取。
  • 进入梦境时lever必须是零,那么从它返回的值也必须为零,因为即使我们递归地调用它,我们也必须输入与退出同样多的梦境。
<font><i>// this is the only file you're allowed to edit</i></font><font>
<b>package</b> dream;
 
<b>import</b> sleep.Sleeper;
 
<b>public</b> <b>class</b> Dream {
    <b>public</b> <b>void</b> dream(Sleeper s) {
        </font><font><i>// TODO implement me</i></font><font>
    }
}
</font>

你能找到这个推理中的缺陷吗?你能想象一个真正奇怪的梦想会让睡眠者失去理智吗?

原文  https://www.jdon.com/53123
正文到此结束
Loading...