wait()要释放锁,是吗?那么如果一个synchronized()的代码块中,没有wait()就永远不释放锁吗?? 突然觉得这好象是不是矛盾的。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 等待机制和锁机制是密切相关的,在调用wait()之前,线程必须获得该对象的对象级别所的排斥性访问权限,在进入wait()后,该线程释放锁(为了让其他的线程得到该对象的锁,从而执行Notifty()),当从wait()返回前,线程与其他线程竞争重新获得锁。在一个synchronized()的代码块中不一定要拥有wait(),当从该synchronized块中离开时就可以释放锁,不管是执行完毕还是return,throw等,从该块内调用方法是不会失去锁的我发现LZ的问题都有些奇怪,这些问题只要自己查一下资料,答案是很明显的 楼主把锁和条件对象搞混了吧。每个对象都有一个内部对象锁,这个锁有一个相关条件。用synchronizde声明的方法,表示这个内部对象所就会保护整个方法。而wait()是说明即使有一个线程获得锁了,但是不满足一定的条件,也会把这个线程添加到等待集中,相应的notifty()则是说明条件满足了,等到下一次线程获得锁的时候就可以执行相关的代码。 synchronized是保持执行的这段代码的锁不被其他线程拥有 如果synchronized中的代码执行完毕其他线程就获得了这个机会 wait(): Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object. wait()是不同于sleep的,sleep是说当前线程即使sleep状态也抱着这把锁,其余的方法不可以访问,而wait方法只是说当前线程处于等待状态,但是如果改方法即使加锁了,别的线程也可以访问的,只是当前线程等待。 我反而觉得基础难。现在越来越觉得wait() = notify();我知道书上说不一样。理解起来是一样的。1)都是释放锁。2)都是退出当前运行3)唤醒别人进来执行。 如何这样理解就有区别了wait是释放共享锁并将该线程加入object的等待“队列”(并不是先进先出)中。notify是在该object的等待“队列”中唤醒一个等待的线程。 wait() = notify(); 这个不一样的 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(); } } }} 求助,JTable对象建立好后还能使用getToolTipText(MouseEvent event)吗? 请高手解释一下Java错误跟踪 public void paint(Graphics g)这句不知道是什么意思? 输出B1@10b30a7是什么意思?? 关于java里GC的问题。 class文件打包为jar文件 使用第三方class 有关垃圾回收? 请大家帮我解释一下这几句的意思 VISUAL J++在XP上的安装 jdbc连接sql server的问题 java 布局管理问题 谁有网页游戏的源代码??比如热血三国的
在一个synchronized()的代码块中不一定要拥有wait(),当从该synchronized块中离开时就可以释放锁,不管是执行完毕还是return,throw等,从该块内调用方法是不会失去锁的
我发现LZ的问题都有些奇怪,这些问题只要自己查一下资料,答案是很明显的
每个对象都有一个内部对象锁,这个锁有一个相关条件。
用synchronizde声明的方法,表示这个内部对象所就会保护整个方法。而wait()是说明即使有一个线程获得锁了,但是不满足一定的条件,也会把这个线程添加到等待集中,相应的notifty()则是说明条件满足了,等到下一次线程获得锁的时候就可以执行相关的代码。
其他线程就获得了这个机会
Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object.
现在越来越觉得wait() = notify();
我知道书上说不一样。理解起来是一样的。
1)都是释放锁。
2)都是退出当前运行
3)唤醒别人进来执行。
wait是释放共享锁并将该线程加入object的等待“队列”(并不是先进先出)中。
notify是在该object的等待“队列”中唤醒一个等待的线程。
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();
}
}
}
}