wait()要释放锁,是吗?那么如果一个synchronized()的代码块中,没有wait()就永远不释放锁吗??

孤尽JavaSea 2009-10-01 10:01:20
突然觉得这好象是不是矛盾的。
...全文
1302 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
windforcecn 2009-10-07
  • 打赏
  • 举报
回复
wait和notify都是释放锁,sleep不释放

synchronized()的代码块中运行完就释放锁了

wait和notify必须先获得唯一控制权,一般用加锁实现

看看下面代码的结果你应该会明白一点


package test;

public class TestThread {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new TestThread();

}

public String a = "test";

public TestThread() {
Thread thread1 = new WaitThread();
Thread thread2 = new WaitThread();
thread1.start();
thread2.start();

try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Thread thread3 = new NotifyThread();
thread3.start();

}

class WaitThread extends Thread {
public void run() {
synchronized (a) {
try {
System.out.println("before wait : " + Thread.currentThread() + ":" + a);
a.wait();
System.out.println("after wait : " + Thread.currentThread() + ":" + a);
System.out.println("before sleep : " + Thread.currentThread() + ":" + a);
sleep(1000);
System.out.println("after sleep : " + Thread.currentThread() + ":" + a);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

class NotifyThread extends Thread {
public void run() {
synchronized (a) {
a.notifyAll();
}
}
}
}


bendanlzh 2009-10-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 java_gannbare 的回复:]
我反而觉得基础难。
现在越来越觉得wait() = notify();
我知道书上说不一样。理解起来是一样的。
1)都是释放锁。
2)都是退出当前运行
3)唤醒别人进来执行。
[/Quote]
如何这样理解就有区别了
wait是释放共享锁并将该线程加入object的等待“队列”(并不是先进先出)中。
notify是在该object的等待“队列”中唤醒一个等待的线程。

24K純帥 2009-10-07
  • 打赏
  • 举报
回复
wait() = notify(); 这个不一样的
孤尽JavaSea 2009-10-06
  • 打赏
  • 举报
回复
我反而觉得基础难。
现在越来越觉得wait() = notify();
我知道书上说不一样。理解起来是一样的。
1)都是释放锁。
2)都是退出当前运行
3)唤醒别人进来执行。
loveofmylife 2009-10-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 java_gannbare 的回复:]
可是大家应该想到,执行方法一次,是非常快的,分到的时间片远还没用完呢。
[/Quote]
这句话就是片面的,有的方法是很快可是有些就是很慢的了,不能一概而论,比如你往数据库插入10万条数据...
孤尽JavaSea 2009-10-02
  • 打赏
  • 举报
回复
可是大家应该想到,执行方法一次,是非常快的,分到的时间片远还没用完呢。
zhuhichn 2009-10-02
  • 打赏
  • 举报
回复
wait()是不同于sleep的,sleep是说当前线程即使sleep状态也抱着这把锁,其余的方法不可以访问,而wait方法只是说当前线程处于等待状态,但是如果改方法即使加锁了,别的线程也可以访问的,只是当前线程等待。
loveofmylife 2009-10-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 java_gannbare 的回复:]
wait()就相当于sleep()
[/Quote]
LZ还是好好看书吧,我也承认多线程机制的确是很难的,我现在正热衷于这个,可是这些基础还是比较容易掌握的
  • 打赏
  • 举报
回复
sleep()不释放锁吧
孤尽JavaSea 2009-10-02
  • 打赏
  • 举报
回复
wait()就相当于sleep()
Sodino 2009-10-02
  • 打赏
  • 举报
回复
wait():
Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object.
dajiadebeibei9 2009-10-01
  • 打赏
  • 举报
回复
synchronized是保持执行的这段代码的锁不被其他线程拥有 如果synchronized中的代码执行完毕
其他线程就获得了这个机会
wanghb121 2009-10-01
  • 打赏
  • 举报
回复
楼主把锁和条件对象搞混了吧。
每个对象都有一个内部对象锁,这个锁有一个相关条件。
用synchronizde声明的方法,表示这个内部对象所就会保护整个方法。而wait()是说明即使有一个线程获得锁了,但是不满足一定的条件,也会把这个线程添加到等待集中,相应的notifty()则是说明条件满足了,等到下一次线程获得锁的时候就可以执行相关的代码。
loveofmylife 2009-10-01
  • 打赏
  • 举报
回复
等待机制和锁机制是密切相关的,在调用wait()之前,线程必须获得该对象的对象级别所的排斥性访问权限,在进入wait()后,该线程释放锁(为了让其他的线程得到该对象的锁,从而执行Notifty()),当从wait()返回前,线程与其他线程竞争重新获得锁。
在一个synchronized()的代码块中不一定要拥有wait(),当从该synchronized块中离开时就可以释放锁,不管是执行完毕还是return,throw等,从该块内调用方法是不会失去锁的
我发现LZ的问题都有些奇怪,这些问题只要自己查一下资料,答案是很明显的
大海Online 2009-10-01
  • 打赏
  • 举报
回复
是的~~

62,621

社区成员

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

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