您好,登錄后才能下訂單哦!
怎么在Java中利用多線程搶票?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
局部變量:
定義在方法內,方法運行存在,方法運行結束銷毀,無法保存一個持久化數據!!!
成員變量:
保存在類對象內,創建對象之后存在,對象不銷毀成員變量也不會被內存收回。因為
在每一個類對象中,都存在一個對應的成員變量,這些成員變量不是同一個數據。不是
共享資源,不合適!!!
靜態成員變量:
保存在內存的【數據區】,類文件加載時就存在,并且可以給每一個類對象使用,一處修改
處處受影響!!!作為共享資源非常合適!!!
問題
1. 銷售順序存在異常
2. 存在某一張票被銷售了多次
使用鎖
代碼如下
class SaleThread implements Runnable { /** * 使用靜態成員變量作為100張票的保存變量,是一個共享資源。 */ private static int tickets = 100; @Override public void run() { // 完成售票過程 while (true) { /* 字符串可以作為鎖對象,因為雙引號包含的字符串不管在代碼中如何運行,有且只有一個 */ synchronized ("鎖") { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } if (tickets > 0) { System.out.println(Thread.currentThread().getName() + "售出了" + tickets + "張票"); tickets--; } else { System.out.println(Thread.currentThread().getName() + "售罄!!!"); break; } } } } } public class Demo { public static void main(String[] args) { Thread t1 = new Thread(new SaleThread(), "售票人員1"); Thread t2 = new Thread(new SaleThread(), "售票人員2"); Thread t3 = new Thread(new SaleThread(), "售票人員3"); t1.start(); t2.start(); t3.start(); } }
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。