为什么wait()
在同步块内?我的意思是,只有一个线程将进入同步块,那么另一个线程如何执行wait()
指令?为什么在里面等待同步?
回答
- 同步关键字用于独占访问。
- 要使方法同步,只需将synchronized关键字添加到其声明中即可。然后,同一对象上的同步方法的任何两次调用都可以相互交错。
- 同步语句必须指定提供内部锁定的对象。使用同步(this)时,您必须避免同步其他对象方法的调用。
- wait()通知调用线程放弃监视器并进入休眠状态,直到某个其他线程进入相同的监视器并调用notify()。
- notify()唤醒在同一个对象上调用wait()的第一个线程。
例子:
public class ThreadA {
public static void main(String[] args){
ThreadB b = new ThreadB();
b.start();
synchronized(b){
try{
System.out.println("Waiting for b to complete...");
b.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("Total is: " + b.total);
}
}
}
class ThreadB extends Thread{
int total;
@Override
public void run(){
synchronized(this){
for(int i=0; i<100 ; i++){
total += i;
}
notify();
}
}
}
得到它:http://www.programcreek.com/2009/02/notify-and-wait-example/
为什么'synchronized(this)'在'ThreadB'中被调用?不仅线程本身调用运行,并且没有其他线程? – Artemkller545 2014-08-29 12:56:51
当我尝试运行没有这个同步块,我得到了一个java.lang.IllegalMonitorStateException,这很有趣。当通过b同步threadA时,它需要保证notify()也被同步,或者其他实例可以调用notify。 – 2014-08-29 13:17:14
Why is wait() inside of a synchronized block?
因为线程需要有你呼吁wait()
对象的监视器,在一个synchronized方法的情况下,this
对象。
I mean, only one thread will enter the synchronized block, so how can the other
thread execute the wait() instruction?
它不能,只有同步块内的线程可以执行wait()
,允许其他线程进入同步块。
“[foo。]为什么[需要]在[synchronized(foo)]内部等待?”你基本上说,“因为它需要。” _why_会更好的回答。完整的答案对于这个空间来说太大了,但简而言之, 'foo.wait()'的调用者应该等待一些明确的,可测试的条件,并且为了避免“丢失的通知”,可以测试或改变条件的每个代码块(包括服务员)应该同步同一把锁。 Java不能强制代码块是同步的,但是它对等待的块()和通知()的块是这样做的。 – 2014-08-29 13:19:25
- 1. java - 从等待里面同步调用同步方法
- 2. JS异步/等待 - 为什么等待需要异步?
- 3. 在等待里面另一个等待
- 4. 为什么我的应用程序等待同步这么多?
- 5. 为什么在这里需要同步?
- 6. 为什么同步上下文不能用于等待?
- 7. 为什么页面不停地等待?
- 8. 为什么我无法通过同步等待来获取异步等待的值?
- 9. 为什么异步/等待不会异步运行?
- 10. soundPool.load()里面(等待)线程?
- 11. 为什么不等待?
- 12. SQLPLus等待...为什么?
- 13. 为什么等待块Dispatcher.Invoke?
- 14. 为什么要等待window.onload?
- 15. 为什么WaitForExit()不等待?
- 16. 为什么在等待后HttpContext.Current为null?
- 17. 同步中断等待
- 18. 同步等待$ .ajax调用
- 19. 等待()/通知()同步
- 20. 同步ArrayList并等待
- 21. 为什么等待/通知不在这里?
- 22. 为什么我在Windows上获取NotImplementedError异步并等待?
- 23. 为什么要在方法中间等待异步方法?
- 24. 在异步函数中,为什么我必须等待?
- 25. 为什么必须在“异步”方法中“等待”?
- 26. 异步等待不等待
- 27. 为什么总是在异步操作(异步等待)中同步在asp.net mvc中
- 28. 等待一个异步回调同步
- 29. 在Web-Worker中同步等待消息
- 30. XmlPullParser同步:线程正在等待
哪'synchronized'块你在说什么?你的问题真的不清楚(也很广泛)...... – BackSlash 2014-08-29 12:49:16
没有任何答案,无论是在这里还是在副本中,都提到了一个典型的原因:“notifyAll”将会是一团糟,无需在继续之前重新获得锁定。 – 2014-08-29 13:22:18
这是因为在你等待某件事之前,你必须确定事情还没有发生。你必须确保它不会在你等待时发生。所以你必须持有一个锁来等待某件事 - 这个锁可以保护你等待状态改变的东西。 – 2016-03-30 09:35:59