问题:刚开始没有同步的时候,运行结果可能回事mike------女女等等这些
说明线程t1再 运行s.nme=mike就被t2抢到执行权则输出mike----女女
而有了同步后,t1运行到s。name=mike时被t2抢到执行权,但是t2判断有锁锁住的于是就没有输出,然后又到t1抢到执行权后,s。sex=nannan,锁打开,t2抢到执行权输出mike-----nannan
所以t1在wait()后,t2获得执行权后 应该判断是有锁的,所以不能输出,例如Input中s。b为真,于是就wait();t2得到执行权后判断是有锁的,应该根本就执行不到if(!s。b) 才对啊,感觉这里好矛盾啊,
package Thread;
public class InputOutputDemo
{
public static void main(String[] args)
{
Res r=new Res();
Input in=new Input(r);
Output out=new Output(r);
Thread t1=new Thread(in);
Thread t2=new Thread(out);
t1.start();
t2.start();
}
}
class Res
{
String name;
String sex;
boolean b=true;
}
class Input implements Runnable
{
private Res s;
public Input(Res s)
{
this.s=s;
}
public void run()
{
int x=0;
int count=0;
while(true)
{
synchronized (s) {
if(s.b)
{
try{s.wait();}
catch(Exception e){}
}
if(x==0)
{
s.name="mike";
try{Thread.sleep(10);}
catch(Exception e){}
s.sex="man";
}
else
{
try{Thread.sleep(10);}
catch(Exception e){} s.name="丽丽";
s.sex="女女";
}
s.b=!s.b;
try{s.notify();}//唤醒的是Output中s对象的线程
catch(Exception e){}
}
/*if(x==0)
{
s.name="mike";
try{Thread.sleep(10);}
catch(Exception e){}
s.sex="man";
}
else
{
try{Thread.sleep(10);}
catch(Exception e){}
s.name="丽丽";
s.sex="女女";
}*/
x=(x+1)%2;
if(count++>100)
break;
}
}
}
class Output implements Runnable
{
private Res s;
public Output(Res s)
{
this.s=s;
}
public void run()
{
int count=0;
while(true)
{
try{Thread.sleep(10);}
catch(Exception e){}
synchronized (s) {
if(!s.b)
{
try{s.wait();}
catch(Exception e){}
}
System.out.println(s.name+"...."+s.sex);
s.b=!s.b;
try{s.notify();}//唤醒的是Input中s对象的线程
catch(Exception e){}
}
//System.out.println(s.name+"...."+s.sex);
if(count++>100)
break;
}
}
|
|