一、執行緒的同步
class window2 implements runnable}}
}}public class testwindow2
}
方式二:同步方法
將操作共享資料的方法宣告為synchronized,即此方法為同步方法,能夠保證當其中乙個執行緒執行
此方法時,其他執行緒在外等待直至此執行緒執行完此方法。
同步方法的鎖:this
例項:模擬火車站售票視窗,開啟三個視窗售票,總票數為100
class window3 extends thread
}public synchronized void show()
}}public class testwindow3
}
4、由於同乙個時間只能有乙個執行緒訪問共享資料,效率變低了
5、釋放鎖的操作:
(1)當前執行緒的同步方法、同步**塊執行結束;
(2)當前執行緒的同步方法、同步**塊中遇到break、return終止了該方法、該**塊的繼續執行;
(3)當前執行緒在同步**塊、同步方法中出現了未處理的error或exception,導致異常結束;
(4)當前執行緒在同步**塊、同步方法中執行了執行緒物件的wait()方法,當前執行緒暫停並釋放鎖。
6、不會釋放鎖的操作:執行緒執行同步**塊或同步方法時,程式呼叫thread.sleep()、thread.yield()方法暫時停止當前執行緒的執行。
二、執行緒的通訊
1、wait()與notify()和notifyall()
(1)wait():令當前執行緒掛起並放棄cpu、同步資源,使別的執行緒可訪問並修改共享資源,而當前執行緒排隊等候再次對資源的訪問;
(2)notify():喚醒正在排隊等待同步資源的執行緒中優先順序最高者結束等待;
(3)notifyall():喚醒正在排隊等待的所有執行緒結束等待。
這三個方法只有在synchronized方法或synchronized**塊中才能使用。
例項:
package com.testthread;
//執行緒通訊
//使用兩個執行緒列印1-100,執行緒1,執行緒2交替列印
class printnum implements runnable else
try catch (interruptedexception e) }}
}}public class testcommunication
}
三、練習
生產者消費者問題
生產者(productor)將產品交給店員(clerk),而消費者(customer)從店員處取走產品,
店員一次只能持有固定數量的產品(比如:20),如果生產者試圖生產更多的產品,店員會叫生產者停一下,
如果店中有空位放產品了再通知生產者繼續生產,如果店中沒有產品,店員會告訴消費者等一下,
如果店中有產品了再通知消費者來取走產品。
分析:
public class testproduceconsume
}class clerk catch (interruptedexception e)
}else
}public synchronized void consumeproduct() catch (interruptedexception e)
}else
}}class producer implements runnable
public void run() catch (interruptedexception e)
clerk.addproduct();}}
}class consumer implements runnable
public void run() catch (interruptedexception e)
clerk.consumeproduct();}}
}
JAVA多執行緒 執行緒的同步與鎖
執行緒的同步與鎖 l 執行緒的同步是為了防止多個執行緒訪問乙個資料物件時,對資料造成的破壞。1 執行緒同步的目的是為了保護多個執行緒反問乙個資源時對資源的破壞。2 執行緒同步方法是通過鎖來實現,每個物件都有且僅有乙個鎖,這個鎖與乙個特定的物件關聯,執行緒一旦獲取了物件鎖,其他訪問該物件的執行緒就無法...
JAVA多執行緒同步
1.同步 塊 synchronized 物件 例程 package cn.wf.thread1 多執行緒同步 同步 塊 author wf public class thread test class thread01 implements runnable trycatch interrupted...
java多執行緒 同步
2019獨角獸企業重金招聘python工程師標準 synchronized關鍵字鎖的物件可以是方法 變數 類和當前例項。synchronized不能被繼承,子類將自動去除synchronized關鍵字 public synchronized void 變為public void 方法public s...