关于多线程同步

hxz6619 2007-08-10 08:12:56
这是我的代码,
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
...全文
190 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hxz6619 2007-08-11
  • 打赏
  • 举报
回复
谢谢adongforever和clevercong,问题解决,我自己再想想.
clevercong 2007-08-10
  • 打赏
  • 举报
回复
也就是说,当你第一次put完毕并等待后,get取得了第一个元素,然后get挂起,但是接着问题就来了。如果put方法中执行到isEmpty=false;但还来不及输出时,时间片到了,此时isEmpty已经被设置为false了,然后执行get,取出了第二个元素。
put和get同时访问了IsEmpty,尽管有一个已经被锁。
adongforever 2007-08-10
  • 打赏
  • 举报
回复
在做线程互斥的时候要注意,要到整个互斥指令段完成的时候才能允许其他线程进入。
clevercong 2007-08-10
  • 打赏
  • 举报
回复
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;
Thread.yield();//添加的代码
this.notify();
}
synchronized int get()
{
while(isEmpty)
{
try
{
this.wait();
}
catch(InterruptedException e)
{
System.out.println(e.getMessage());
}
}
isEmpty = true;
Thread.yield();//添加的代码
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());
}
}

adongforever 2007-08-10
  • 打赏
  • 举报
回复
稍微做了点修改:
class Buffer1{
private int value;
private boolean isEmp=true;
synchronized void put(int i){
value = i;
}
synchronized int get(){
return value;
}
public void setisEmpty(boolean b){
isEmp=b;
}
public boolean isEmpty(){
return isEmp;
}
}


class Sender1 extends Thread{
private Buffer1 bf;
public Sender1(Buffer1 bf){
this.bf = bf;
}
public void run(){
for(int i=1;i<6;i++){
while(!bf.isEmpty()){}
bf.put(i);
System.out.println("Sender put:"+i);
bf.setisEmpty(false);
}
}
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++){
while(bf.isEmpty()){}
System.out.println("\t\t Receiver get:"+bf.get());
bf.setisEmpty(true);
}
}
}
树成 2007-08-10
  • 打赏
  • 举报
回复
你首先要理解同步是怎么回事才行。

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧