Java多線程的例子及synchronized關鍵字鎖定對象的用法
該例子所應用場景:一個線程負責生產,多個線程(該例為3個)負責消費;生產者不斷的往堆棧中加入數據,消費者不斷的從堆棧中取數據。
代碼如下:
package com.xs.mail.thread; import java.util.ArrayList; import java.util.List; class Widget { } class WidgetMaker extends Thread { List<Widget> finishedWidgets = new ArrayList<Widget>(); public void run() { try { while (true) { //每1秒鍾生產一個Widget Thread.sleep(1000);// act busy Widget w1 = new Widget(); // 也就是說需要5秒鍾才能新產生一個Widget,這決定了一定要用notify而不是notifyAll // 因為上麵兩行代碼不是同步的,如果用notifyAll則所有線程都企圖衝出wait狀態 // 第一個線程得到了鎖,並取走了Widget(這個過程的時間小於5秒,新的Widget還沒有生成) // 並且解開了鎖,然後第二個線程獲得鎖(因為用了notifyAll其他線程不再等待notify語句 // ,而是等待finishedWidgets上的鎖,一旦鎖放開了,他們就會競爭運行),運行 // finishedWidgets.remove(0),但是由於finishedWidgets現在還是空的, // 於是產生異常 // ***********這就是為什麼下麵的那一句不能用notifyAll而是要用notify synchronized (finishedWidgets) { finishedWidgets.add(w1); finishedWidgets.notify(); // 這裏隻能是notify而不能是notifyAll } } } catch (InterruptedException e) { } } public Widget waitForWidget() { synchronized (finishedWidgets) { if (finishedWidgets.size() == 0) { try { System.out.println("暫停線程:" + Thread.currentThread().getName()); finishedWidgets.wait(); } catch (InterruptedException e) { } } return finishedWidgets.remove(0); } } } public class WidgetUser extends Thread { private WidgetMaker maker; public WidgetUser(String name, WidgetMaker maker) { super(name); this.maker = maker; } public void run() { while (true) { Widget w = maker.waitForWidget(); System.out.println(getName() + " got a widget"); } } public static void main(String[] args) { WidgetMaker maker = new WidgetMaker(); maker.start(); new WidgetUser("Tom", maker).start(); new WidgetUser("Jack", maker).start(); new WidgetUser("Marry", maker).start(); } }
最後更新:2017-04-02 22:15:57
上一篇:
12.9 訓練 E - Ternary Password
下一篇:
Chrome 開始允許用戶自己監控擴展的活動
PostgreSQL 10.0 preview 功能增強 - 備庫支持邏輯訂閱, 支持訂閱漂移
C#控製管理VisualSVN Server
Spark實踐的階段性總結
When does the Oracle library for st_shapelib.dll need to be changed?
[.NET 基於角色安全性驗證] 之三:ASP.NET Forms 身份驗證
淘寶兼職刷單被騙了怎麼辦(報警電話:053-2869-99151)
舉例說明jquery插件的編寫方法
大數據日誌分析項目架構
Android 開發 之 JNI入門 - NDK從入門到精通
【AllJoyn框架-06】關於基於AllJoyn的即插即用的進展總結