Java謎題3:汽車 - 解決方案
讓我們看看如何讓升級後的汽車打破速度限制。
package car; public final class Car { private final int MAX_SPEED = 100; private int speed = 0; public synchronized void accelerate(int acceleration) { speed += acceleration; if (speed > MAX_SPEED) crash(); } public synchronized void crash() { speed = 0; } public synchronized void vroom() { if (speed > MAX_SPEED * 10) { // The goal is to reach this line System.out.println("Vroom!"); } } } |
給所有賽車手的教訓是:我們希望賽車加速很多(speed += acceleration必須執行),但不要在撞到樹並完全停止的地方執行(speed = 0不得執行)。
這兩種陳述之間會發生什麼?if(speed>max_speed)對我們沒有任何幫助,因為speed確實需要高於max_speed。所以剩下的就是對crash()方法的呼叫。那一個必須失敗:我們想要crash()崩潰!
我們可以透過確保堆疊上沒有足夠的空間來呼叫任何方法來實現。如果呼叫accelerate時堆疊幾乎已滿,則呼叫crash()時會出現stackOverflowerRor。我們怎麼才能讓這堆東西都快滿了呢?一種方法是強制它:一種無限遞迴的方法,不斷嘗試。
package driver; import car.Car; public class Driver { private static Car car = new Car(); public static void main(String args[]) { try { recurse(); } catch (StackOverflowError e) { } car.vroom(); } public static void recurse() { car.accelerate(1001); recurse(); } } |
起效了!…至少在某些系統上。這裡的一個問題是,如果你試圖加速這麼多並繼續崩潰(在我的系統崩潰1500次之後),jvm會做一些汽車製造商從未做過的事情:它最佳化汽車,以確保它能夠很快崩潰。它把對crash()的呼叫排成一行,將其本質上減少為if(speed>max_speed)speed=0;。這樣就消除了stackoverflower錯誤的可能性。
我們可以透過稍微溫和些來解決這個問題:少些崩潰,因此JVM不會決定最佳化它。首先增加堆疊直到它接近需要的位置,然後才將汽車新增到程式中。但知道你接近極限的唯一方法就是擊中它。因此,我們在沒有汽車的情況下遞迴,直到我們遇到堆疊溢位,然後向後退幾步,再應用上面的強制解決方案:
package driver; import car.Car; public class Driver { static Car car = new Car(); static int a = 0; public static void main(String args[]) { recurse(); car.vroom(); } static void recurse() { try { recurse(); // recurse without the car } catch (StackOverflowError e) { // when we've hit the limit of the stack, just go back out } if (a++ == 10) { // after taking 10 steps back recurse2(); // recurse with the car } } static void recurse2() { car.accelerate(1001); recurse2(); } } |
另一種解決方案是使用Thread.stop。但是很難把時間計算得恰到好處; 它在整個系統中不可靠。
相關文章
- Java謎題3:汽車Java
- Java謎題7:餅乾-解決方案Java
- Java謎題1:小丑 - 解決方案Java
- Java謎題5:球(ball)-解決方案Java
- Java謎題6:雞與蛋-解決方案Java
- Java謎題:小丑Java
- 豐田汽車問題解決方法(A3報告)
- nginx /Java 解決跨域問題方案NginxJava跨域
- WebApi 跨域問題解決方案(3):CORSWebAPI跨域CORS
- 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
- 木馬問題解決方案
- jive中文問題解決方案
- 新能源汽車使用電感的解決方案gujing
- 華為:智慧汽車解決方案 2030(附下載)
- react-navigation升級3.x 問題解決方案ReactNavigation