本帖最后由 二货哈士奇 于 2014-10-30 16:18 编辑
/*
需求:完成线程间通信,避免出现错误信息,重复信息
思路:
1、定义一个资源类,作为多线程操作的对象
2、定义两个多线程来操作上述资源
3、通过持有相同锁的同步函数同步两个多线程,避免错误信息,保证数据安全性
4、通过等待唤醒机制,避免重复信息
步骤:
1、定义资源类 Res 作为被操作的对象,并建立对象r
2、定义两个类 In、Out implements Runnable,分别复写run函数
建立两个Thread对象多线程进行In Out类
3、分别在In Out中定义两个同步函数,锁都定义为 资源对象r,保证同步数据安全性
4、分别在In Out中加入wait(),notify()函数,避免数据重复
*/
/*
对应视频145,线程间通信安全性,简化代码
这个代码与老师的区别在于setData,printData的函数中,if判断语句的else语句我加了括号,结果打印就是女女男男
测试后发现,printData的else函数加括号无影响,只要setData函数一加括号就打印异常
*/
class Res
{
private String name;
private String sex;
private boolean flag=false;
public synchronized void setData(String name,String sex)
{
if(this.flag)
try{this.wait();} catch(Exception e){}
// else
// {
this.name = name;
this.sex = sex;
flag = true;
this.notify();
// }
}
public synchronized void printData()
{
if(!flag)
{
try{this.wait();} catch(Exception e){}
}
else
{
System.out.println(this.name+"....."+this.sex);
flag = false;
this.notify();
}
}
}
class InPut implements Runnable
{
private Res r;
InPut(Res r)
{
this.r =r;
}
public void run()
{
int x = 0;
while(true)
{
if(x==0)
r.setData("zhangsan","man");
else
r.setData("妹妹","女女女女女");
x = (x+1)%2;
}
}
}
class OutPut implements Runnable
{
private Res r;
OutPut(Res r)
{
this.r = r;
}
public void run()
{
while(true)
r.printData();
}
}
class YiChangs
{
public static void main(String[] args)
{
Res r = new Res();
new Thread(new InPut(r)).start();
new Thread(new OutPut(r)).start();
}
}
如题,我是按照毕老师的视频写的代码
问题出现在第33行,毕老师当时的逻辑是当if不满足的时候,再执行name等属性的变更
所以我在第33行中加入了else,再做name属性的变更,而我的运行结果就和老师的不同时 女女男男 这样的格式
而不是老师所说的 女男女男 这个样子,出现了多线程安全问题
请帮忙分析下问题所在,多线程在进入wait之后,读到notify之后在哪里回复进行呢
|