synchronized同步程式+生產者消費者模式(訊號燈)解除可能出現的資源問題
多個同步可能會造成資源不正確或者造成死鎖 解決辦法有生產者消費者模式的訊號燈法
*synchronized同步 指的是多個程式訪問同一個資源,為了確保資源的正確性,進行同步
package xidian.lili.threadpro;
/**
*
* 共同的資源是moive
*/
public class Movie {
private String pic;
private boolean flag=true;//一定要初始化 先要生產 才能消費
/**
public Movie(){
}
//播放
public synchronized void play(String pic){
if(!flag){//生產者等待
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//開始生產
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//生產完畢
this.pic=pic;
System.out.println("生產了"+pic);
//通知消費
this.notify();
//生產者停下
this.flag=false;
}
//觀看
public synchronized void watch(){
if(flag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//開始消費
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//消費完成
System.out.println("消費了"+pic);
//通知生產
this.notify();
//停止消費
this.flag=true;
}
}
/**
*
* 共同的資源是moive
* 訪問這個資源的兩個執行緒是Player(生產者)和Wathcher(消費者)
* wait()釋放鎖 區別於sleep(long time)
* notify() 喚醒程式 必須和synchronized配合使用
*/public class Movie {
private String pic;
private boolean flag=true;//一定要初始化 先要生產 才能消費
/**
* 訊號燈
* flag true 生產者生產 消費者等待 生產完畢 通知消費 生產者停下
* flag false 消費者消費 生產者等待 消費完畢 通知生產 消費者停下
*/
public Movie(){}
//播放
public synchronized void play(String pic){
if(!flag){//生產者等待
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//開始生產
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//生產完畢
this.pic=pic;
System.out.println("生產了"+pic);
//通知消費
this.notify();
//生產者停下
this.flag=false;
}
//觀看
public synchronized void watch(){
if(flag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//開始消費
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//消費完成
System.out.println("消費了"+pic);
//通知生產
this.notify();
//停止消費
this.flag=true;
}
}
//生產者
public class Player implements Runnable{private Movie movie;
public Player(Movie m){
this.movie=m;
}
@Override
public void run() {
for(int i=0;i<20;i++){
if(i%2==0)
{
movie.play("你好嗎");
}
else{
movie.play("我很好");
}
}
}
}
package xidian.lili.threadpro;
//消費者
public class Watcher implements Runnable {private Movie movie;
public Watcher(Movie m){
this.movie=m;
}
@Override
public void run() {
for(int i=0;i<20;i++){
movie.watch();
}
}
}
package xidian.lili.threadpro;
//主程式 應用
public class App {public static void main(String[] args) {
//建立同一個資源
Movie m=new Movie();
//兩個執行緒
Player p=new Player(m);
Watcher w=new Watcher(m);
new Thread(p).start();
new Thread(w).start();
}
}
相關文章
- 面試必問:訊號量與生產者消費者問題!面試
- java實現生產者消費者問題Java
- 生產者消費者問題-C++程式碼實現C++
- 訊號量實現生產者消費者(程式碼邏輯有問題,不適合多個消費者,不常用)
- 生產者與消費者問題
- 生產者消費者模式模式
- python中多程式消費者生產者問題Python
- linux 生產者與消費者問題Linux
- 生產消費者模式模式
- java編寫生產者/消費者模式的程式。Java模式
- python 生產者消費者模式Python模式
- 九、生產者與消費者模式模式
- 使用BlockQueue實現生產者和消費者模式BloC模式
- 生產者消費者模式--java多執行緒同步方法的應用模式Java執行緒
- 併發設計模式---生產者/消費者模式設計模式
- python執行緒通訊與生產者消費者模式Python執行緒模式
- Java多執行緒程式設計(同步、死鎖、生產消費者問題)Java執行緒程式設計
- 生產者消費者
- 生產者消費者模式,以及基於BlockingQueue的快速實現模式BloC
- 使用wait()與notifyAll()實現生產者與消費者模式AI模式
- 阻塞佇列和生產者-消費者模式佇列模式
- Java實現生產者和消費者Java
- python中多執行緒消費者生產者問題Python執行緒
- 作業系統—生產者消費者問題詳解作業系統
- GoLang中生產者消費者模式解決併發問題Golang模式
- Thinking in Java---執行緒通訊+三種方式實現生產者消費者問題ThinkingJava執行緒
- 生產者消費者模型模型
- 執行緒同步介紹及 生產者消費者問題舉例 C#版執行緒C#
- Python並行程式設計(三):多執行緒同步之semaphore(訊號量)實現簡易生產者-消費者模型Python並行行程程式設計執行緒模型
- Java中的設計模式(二):生產者-消費者模式與觀察者模式Java設計模式
- 6、JUC:傳統的生產者消費者問題,防止虛假喚醒問題
- 使用Disruptor實現生產者和消費者模型模型
- ActiveMQ 生產者和消費者demoMQ
- 多生產者-消費者中假死現象的處理
- 生產消費問題
- 執行緒間的協作(2)——生產者與消費者模式執行緒模式
- golang 併發程式設計之生產者消費者Golang程式設計
- 「Kafka應用」PHP實現生產者與消費者KafkaPHP