黑马程序员技术交流社区
标题:
想运行状况想迷糊了。。。关于同步函数的问题
[打印本页]
作者:
王乐
时间:
2012-10-12 21:01
标题:
想运行状况想迷糊了。。。关于同步函数的问题
关于这下这段代码
我实在如果SET函数和GET函数不同步的话,编译可以,运行时会报错的。
可是这俩个线程要运行的时候要读while(flag)。这个语句不是已经能保证他们俩之中只有1个线程可以继续往下运行,另一个结果为真就会执行wait线程等待吗?
为什么还需要同步这两个函数呢?
求教,下面附上代码:
class ZiYuan
{
private String name;
private int num=1;
private boolean flag=false;
synchronized void set(String a)
{
while(flag)
try{wait();}catch(Exception e ){}
this.name=a+"__"+num++;
System.out.println(Thread.currentThread().getName()+"生产者"+this.name);
flag=true;
this.notifyAll();
}
synchronized void get()
{
while(!flag)
try{wait();}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"消费者。。。。。。。。。"+this.name);
flag=false;
this.notifyAll();
}
}
class ZhiZao implements Runnable
{
private ZiYuan z;
ZhiZao(ZiYuan z)
{
this.z=z;
}
public void run()
{
while(true)
{
z.set("商品");
}
}
}
class XiaoShou implements Runnable
{
private ZiYuan z;
XiaoShou(ZiYuan z)
{
this.z=z;
}
public void run()
{
while(true)
{
z.get();
}
}
}
class Sorry
{
public static void main(String[] args)
{
ZiYuan z=new ZiYuan();
ZhiZao zz=new ZhiZao(z);
XiaoShou x=new XiaoShou(z);
Thread t1=new Thread(zz);
Thread t2=new Thread(zz);
Thread t3=new Thread(x);
Thread t4=new Thread(x);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
作者:
王乐
时间:
2012-10-13 12:55
up~~~~
求解~~
作者:
王乐
时间:
2012-10-15 13:23
UP~~~
求解~~
作者:
梁世喜
时间:
2012-10-15 15:37
本帖最后由 梁世喜 于 2012-10-15 15:38 编辑
毕老师的事例要实现的效果是 生产一个拿走一个,永远只能有一个生产一个在销售。
假设生产和销售都不是同步函数。
当某一瞬间销售者唤醒了所有进程(flag为false) ,线程1 在调用set()刚好打印完时(假设Cpu执行权被2拿到了。),线程2 调用了set(); 这就造成了同时生产两个。
同步函数在同一时间只能被一个线程调用,确保了函数在被调用过程中不可能被其他线程所执行。
(当线程1调用函数执行到一半,虽然线程2也有执行权,但函数却被线程1锁住了,所以不能执行)
确保了同一时间只能生产一个。
作者:
王梁星
时间:
2012-10-15 15:57
synchronized 保证使用当前资源的唯一性;while()语句保证生产者生产产品或者销售者销售产品的唯一性。不知这样理解行不行。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2