synchronized同步进程+生产者消费者模式(信号灯)解除可能出现的资源问题

多个同步可能会造成资源不正确或者造成死锁  解决办法有生产者消费者模式的信号灯法

*synchronized同步  指的是多个进程访问同一个资源,为了确保资源的正确性,进行同步
package xidian.lili.threadpro;
/**
 * 
 * 共同的资源是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;
}
}

package xidian.lili.threadpro;

//生产者

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();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值