看到一个多线程的包子类设计,根据这个自己写的和一些感悟,wait()应该是会释放对象锁

包子类
public class BaoZi {
String Pi;
String Xian;
boolean isHave =false;
}
包子铺类
public class BaoZiPu implements Runnable{
    private BaoZi baoZi;
public BaoZiPu(BaoZi baoZi){
this.baoZi=baoZi;
}
@Override
public void run() {
int count=0;
while (true){
synchronized (baoZi){
if(baoZi.isHave==true){
try {
baoZi.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(count%2==0){
baoZi.Pi="水晶皮";
baoZi.Xian="麻婆豆腐馅";
}
else if (count%2==1){
baoZi.Pi="白皮";
baoZi.Xian="鲜肉馅";
}
System.out.println("包子铺正在生成"+baoZi.Pi+baoZi.Xian+"包子");
System.out.println("生产包子中请等待5秒");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
baoZi.isHave=true;
count++;
baoZi.notify();
}
}
}
}
吃货类
public class ChiHuo implements Runnable{
    private BaoZi baoZi;
public ChiHuo(BaoZi baoZi){
this.baoZi=baoZi;
}
@Override
public void run() {
while (true){
System.out.println("吃货来了");
synchronized (baoZi){
if (baoZi.isHave==false){
try {
baoZi.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("吃货正在吃"+baoZi.Pi+baoZi.Xian+"包子");
System.out.println("吃完包子了,包子铺要继续生产包子");
baoZi.isHave=false;
baoZi.notify();
System.out.println("-------------------------------------------");

}
}
}
}
测试类
public class Test {
    public static void main(String[] args) {
BaoZi baoZi = new BaoZi();
new Thread(new ChiHuo(baoZi)).start();
new Thread(new BaoZiPu(baoZi)).start();
/*
运行结果:
包子铺正在生成水晶皮麻婆豆腐馅包子
生产包子中请等待5秒
//这里有五秒的延迟
吃货正在吃水晶皮麻婆豆腐馅包子
吃完包子了,包子铺要继续生产包子
-------------------------------------------
形成原因分析:
new Thread(new BaoZiPu(baoZi)).start();
new Thread(new ChiHuo(baoZi)).start();
有两个线程,两个线程同时运行
synchronized (baoZi){}
因为两个线程都有这样的同步代码块,两个线程同时抢夺对象锁,抢到的先进入代码块
第一种先进入包子铺的同步代码块
System.out.println("包子铺正在生成"+baoZi.Pi+baoZi.Xian+"包子");
System.out.println("生产包子中请等待5秒");
输出了这两句话
吃货正在吃水晶皮麻婆豆腐馅包子
吃完包子了,包子铺要继续生产包子
第二种 先进入吃货的同步代码块
因为开始运行baoZi.ishave=flase
运行代码
try {
baoZi.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
进入了等待状态,并释放了对象锁,包子铺的同步代码块抢夺到对象锁运行程序
System.out.println("包子铺正在生成"+baoZi.Pi+baoZi.Xian+"包子");
System.out.println("生产包子中请等待5秒");
输出了这两句话
吃货正在吃水晶皮麻婆豆腐馅包子
吃完包子了,包子铺要继续生产包子

之后两种情况将会相同

//生产包子需要5秒等待的时间
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//生产完成,把包子的状态设置为true,代表有包子
baoZi.isHave=true;
count++;
//唤醒进入等待状态的baoZi
baoZi.notify();
//吃货类被唤醒继续运行代码,包子铺类同样继续运行代码,因为包子的ishave=true,进入了等待状态
吃货类运行代码
System.out.println("吃货正在吃"+baoZi.Pi+baoZi.Xian+"包子");
System.out.println("吃完包子了,包子铺要继续生产包子");
//包子被吃掉,将包子isHave设置为false,代表没有包子
baoZi.isHave=false;
//唤醒包子类对象
baoZi.notify();
System.out.println("-------------------------------------------");
* */
}
}
 

猜你喜欢

转载自www.cnblogs.com/wxgShareBlog/p/13178042.html