Java謎題1:小丑 - 解決方案
package clowns; import java.util.HashSet; import java.util.Set; public class Volkswagen { private static final int CAPACITY = 5; private Set<Clown> clowns = new HashSet<Clown>(); public synchronized void add(Clown clown) { if (clowns.size() >= CAPACITY) { throw new IllegalStateException("I'm full"); } else { clowns.add(clown); } } public synchronized void done() { if (clowns.size() == 20) { // The goal is to reach this line System.out.println("I'm a Volkswagen with 20 clowns!"); } } } |
解決方案的路徑
想象一下這是一輛真正的車,裡面有真正的小丑。
–不可能讓20個小丑進來!只有五個安全帶,這輛大眾汽車真的堅持安全。當小丑進來時,它首先檢查裡面是否還沒有五個人。只有在檢查之後,它才允許另一個人坐(小丑。新增(小丑))。只要有五個小丑坐著,就沒辦法再透過檢查了,所以就沒辦法再增加小丑了。
–你說得對,我們不能一個一個地新增它們。但在他們進車時的檢查和他們真正坐下之間,有一個機會之窗。讓二十個小丑同時上車。他們都將透過大眾汽車的檢查,因為它只計算已經坐下來的小丑。只有在檢查之後他們才能坐下來。
–這輛車的synchronized保護裝置防止其他人在檢查和坐下之間對它做任何事情。
–事實上,它阻止了其他人的干涉。這並不妨礙大眾汽車或小丑自己去做,如果他們有機會(在同一個執行緒上)。
–但他們沒有得到這個機會; 這輛車是一個控制狂。檢查後立即讓他們坐在座位上(在Set)。
–你看過這些座位了嗎?他們已被編號,他們總是首先詢問一個人想要坐哪個號碼(.hashCode())。我們在這裡有一些奇怪的小丑:當他們有機會決定時,在回答之前,他們可以迅速將另一個小丑拉進車裡。然後那個小丑與另一個小丑完全一樣。這種情況一直存在,直到有一堆二十個人遞迴地互相拉扯。只要他們的屁股不碰到座位,安全帶標誌就不會亮。
–那一定很壯觀。
解決方案
遞迴呼叫volkswagen.add,方法是重寫clown.hashcode():
package you; import clowns.Clown; import clowns.Volkswagen; public class You { static int counter = 0; static Volkswagen vw = new Volkswagen(); public static void main(String args[]) { vw.add(new RecursiveClown()); vw.done(); } static class RecursiveClown extends Clown { public int hashCode() { if (++counter < 20) { vw.add(new RecursiveClown()); } return super.hashCode(); } } } |
相關文章
- Java謎題:小丑Java
- Java謎題7:餅乾-解決方案Java
- Java謎題3:汽車 - 解決方案Java
- Java謎題5:球(ball)-解決方案Java
- Java謎題6:雞與蛋-解決方案Java
- nginx /Java 解決跨域問題方案NginxJava跨域
- Vue中跨域問題解決方案1Vue跨域
- Java謎題3:汽車Java
- Java™ 教程(常見問題及其解決方案)Java
- 解謎遊戲謎題設計研究(三):推理類謎題設計遊戲
- 解謎遊戲謎題設計研究(一):物品類謎題設計遊戲
- 解謎遊戲謎題設計研究(二):機關類謎題設計遊戲
- Java 謎題 7:餅乾(Cookie)JavaCookie
- Java謎題5:球(ball)Java
- Java 謎題 2:夢境Java
- Java 程式死鎖問題原理及解決方案Java
- JAVA常見中文問題的解決方案(轉)Java
- 在 Linux 命令列中使用 nudoku 解決謎題Linux命令列
- Java亂碼解決方案Java
- Java謎題6:雞與蛋Java
- Java 8 的日期與時間問題解決方案Java
- 程式設計謎題:提升你解決問題的訓練場程式設計
- 跨域問題,解決方案 – CORS方案跨域CORS
- 跨域問題,解決方案 - CORS方案跨域CORS
- Java限流及常用解決方案Java
- 工作中碰到的Java問題整理及解決方案Java
- Java 謎題4:液體(Liquid)JavaUI
- PHP報錯getimagesize(): SSL operation failed with code 1問題解決方案PHPAI
- 木馬問題解決方案
- jive中文問題解決方案
- Java java.lang.ExceptionInInitializerError 錯誤解決方案JavaExceptionError
- Java 之 Map 的鍵,值多重排序問題解決方案Java排序
- java.lang.OutOfMemoryError及解決方案JavaError
- Java定時任務解決方案Java
- 冒險解謎遊戲如何讓謎題既有難度又有趣?遊戲
- 移動端1px解決方案
- 簡評《嘎吱作響》——解決謎題是否意味著樂趣
- 跨域問題及解決方案跨域