日期:2014-05-20  浏览次数:20800 次

关于多线程同步
这是我的代码,
class   Buffer1
{
private   int   value;
        private   boolean   isEmpty   =   true;
        synchronized   void   put(int   i)
{
while(!isEmpty)
{
try
{
this.wait();
        }
catch(InterruptedException   e)
{
System.out.println(e.getMessage());
}

}
value   =   i;
isEmpty=false;
this.notify();
}
synchronized   int   get()
{

while(isEmpty)
{

try
{
this.wait();
}
catch(InterruptedException   e)
{
System.out.println(e.getMessage());
}
}
isEmpty   =   true;

this.notify();
return   value;

}
}
class   Sender1   extends   Thread
{
private   Buffer1   bf;
public   Sender1(Buffer1   bf)
{
this.bf   =   bf;
}
public   void   run()
{

for(int   i=1;i <6;i++)
{
bf.put(i);
System.out.println( "Sender   put: "+i);
}
}
public   static   void   main(String   args[])
{
Buffer1   bf=new   Buffer1();
(new   Sender1(bf)).start();
(new   Receiver1(bf)).start();
// System.out.println( "afdafd ");

}
}
class   Receiver1   extends   Thread
{
private   Buffer1   bf;
public   Receiver1(Buffer1   bf)
{
this.bf   =   bf;
}
public   void   run()
{

for(int   i=1;i <6;i++)

System.out.println( "\t\t     Receiver   get: "+bf.get());

}
}  


我想实现这种同步效果,但是怎么改都行不通,谁能告诉我哪错了
Sender   put:1
                                    Receiver   get:1
Sender   put:2
                                    Receiver   get:2
Sender   put:3
                                    Receiver   get:3
Sender   put:4
                                    Receiver   get:4
Sender   put:5
                                    Receiver   get:5

------解决方案--------------------
在做线程互斥的时候要注意,要到整个互斥指令段完成的时候才能允许其他线程进入。
------解决方案--------------------
也就是说,当你第一次put完毕并等待后,get取得了第一个元素,然后get挂起,但是接着问题就来了。如果put方法中执行到isEmpty=false;但还来不及输出时,时间片到了,此时isEmpty已经被设置为false了,然后执行get,取出了第二个元素。
put和get同时访问了IsEmpty,尽管有一个已经被锁。