自己存档查看 勿喷!
Java中synchronized的用法
http://www.importnew.com/21866.html
- 生产消费者模型
生产者消费者模型具体来讲,就是在一个系统中,存在生产者和消费者两种角色,他们通过内存缓冲区进行通信,生产者生产消费者需要的资料,消费者把资料做成产品。生产消费者模式如下图。
图转自: https://www.cnblogs.com/chentingk/p/6497107.html
代码分四个类: App.class Movie.class Player.class Watcher.class
App.class:
package com.test.movie;
public class App {
public static void main(String[] args) {
// 共享的资源movie
Movie movie = new Movie();
// 线程
Player player = new Player(movie);
Watcher watcher = new Watcher(movie);
new Thread(player).start();
new Thread(watcher).start();
}
}
Movie.class:
package com.test.movie;
/**
* 一个场景,共同的资源
* 生产者消费者模式 信号灯法
* wait() :等待,释放锁 sleep 不释放锁
* notify()/notifyAll():唤醒
* 与 synchronized
* 一个场景 共用资源
*/
public class Movie {
private String pic;
private boolean flag = true;
//信号灯
//flag -->T 生产生产,消费者等待 ,生产完成后通知消费
//flag -->F 消费者消费 生产者等待, 消费完成后通知生产
// 播放
public synchronized void play(String pic) {
// 判断是否等待
if (!flag) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 生产者生产
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("生产了" + pic); // 生产完毕
this.pic = pic;
// 通知消费
this.notify();
this.flag = false; // 停止生产
}
// 观看
public synchronized void watch() {
// 判断是否等待
if (flag) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 消费者消费
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("消费了" + pic); // 消费完毕
// 消费停止 通知生产
this.notifyAll();
this.flag = true;
}
}
Player.class:
package com.test.movie;
/**
* 生产者
*/
public class Player implements Runnable {
private Movie movie;
public Player(Movie movie) {
this.movie = movie;
}
@Override
public void run() {
for (int i = 0; i < 20; i++) {
if (i % 2 == 0)
movie.play("左青龙");
else
movie.play("右白虎");
}
}
}
Watcher.class
package com.test.movie;
/**
* 观看者
*/
public class Watcher implements Runnable {
private Movie movie;
public Watcher(Movie movie) {
this.movie = movie;
}
@Override
public void run() {
for (int i = 0; i < 20; i++) {
movie.watch();
}
}
}