关于java同步的小问题

lxm7 2006-05-31 06:53:01
我在网上看到如是说:
wait(),notiify(),notifyAll() 必须在同步方法中使用!

我想问这是为什么?
我调用notifyAll() 在一个没有synchronized关键字的方法种不行么?我的class大概如下:
public class AAA
{
private static mapDict = new Hashtable();

private boolean init()
{
boolean bRet = false;
bCanRead = false; //设置mapDict对象为不可读
mapDict = new Hashtable();
mapDict.put("key","value");
bCanRead = true; //设置mapDict对象为可读
Thread.currentThread().notifyAll();
bRet = true;
return bRet;
}

public getValue(String key)
{
while(!bCanRead)
{
try{Thread.currentThread().wait();}
catch(InterruptedException ex){}
}

return mapDict.get(key);
}
}
...全文
170 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
harston 2006-06-02
  • 打赏
  • 举报
回复
分太少了,呵呵
开玩笑,因为很清楚线程的人比较少,不敢乱讲
LBN1012(星空)的意思可能是这样:
public void f()
{
synchronized(obj)
{
obj.wait();
}
}
的时候synchronized(obj)锁定了obj这个资源,相当于一个等待区,别的线程用这个资源的时候发现被锁,自动转入这个对象的等待队列,你释放掉这个对象锁取唤醒的时候,只有在这个队列中线程才能被唤醒。
如果按照你那种设置的方法由于是认为休眠的,所以进程不会把它放到这个对象的等待线程中,因此你用该对象唤醒的时候就不知道把消息传给谁了。
LBN1012(星空)是这样的不?
lxm7 2006-06-02
  • 打赏
  • 举报
回复
我的天啊,多几个人回答吧!!!!!!!!!!!!!!!!!!
lxm7 2006-06-02
  • 打赏
  • 举报
回复
我还是想电话请教,能不能告诉我的电话号码?谢谢!
LBN1012 2006-06-01
  • 打赏
  • 举报
回复
首先这三个方法都是Object类的方法,在调用这三个方法之前都要获取主调对象的锁定。
public synchronized void f()
{
wait();
//相当于this.wait();
}

或者
public void f()
{
synchronized(obj)
{
obj.wait();
}
}

他们表示让正在执行wait()方法的线程进入调用wait()方法的对象的等待区。wait()调用结束后,会释放调用该方法的对象的锁。
调用notify()和notifyAll()的道理一样,需要先获取主调对象的锁。
public synchronized void f()
{
notify();
//相当于this.notify();
}
它们的作用是将主调对象的等待区里等待的线程唤醒。

所以要唤醒一个线程不是调用线程对象的notify,而是看需要被唤醒的线程处于哪个对象的等待区,从而去调那个对象的notify方法。
lxm7 2006-06-01
  • 打赏
  • 举报
回复
你有工作电话么?我还是想交流一下,还是不大理解
lxm7 2006-05-31
  • 打赏
  • 举报
回复
没有人回答么?
lxm7 2006-05-31
  • 打赏
  • 举报
回复
bCanRead等也是静态的
lxm7 2006-05-31
  • 打赏
  • 举报
回复
说明一下,上面的方法都是静态的,忘了加 static

81,092

社区成员

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

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