关于多线程同步
这是我的代码,
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,尽管有一个已经被锁。