wait, notify, notifyAll and synchronized --

别说谁变了你拦得住时间么 提交于 2020-03-02 11:43:19

Object.notify()的API是这样的:

Object.notify

Class Overview | Class Members | This Package | All Packages

Syntax

public final native void notify()

Description

Wakes up a single thread that is waiting on this object's monitor. A thread waits on an object's monitor by calling one of the wait methods.

This method should only be called by a thread that is the owner of this object's monitor. A thread becomes the owner of the object's monitor in one of three ways:

  • By executing a synchronized instance method of that object.
  • By executing the body of a synchronized statement that synchronizes on the object.
  • For objects of type Class, by executing a synchronized static method of that class.

Only one thread at a time can own an object's monitor.

Exceptions

IllegalMonitorStateException if the current thread is not the owner of this object's monitor.

See Also

notifyAll, wait

 

.......

quite confusing!

Thread has 3 states: runnable, running, blocked.

'Wakes up ''s meaning is the key point to understand the whole mistery:

Generally, I think 'Waking up' a thread means putting it into the runnable state(thread list... and, of course, from the blocked state).

one thought: set the threads to runnable state, thusly they got a chance to be scheduled to RUN, thusly they got a chance to acquire the lock. This way, you got a chance to choose between awake one thread or all threads. Because no one knows which is better. Because obviously there's at most one thread can get the lock. Because there's only one lock(monitor)! The only difference is that in case you choose to awake all threads, that'll cause a competition for the LOCK. But generally, either way you choosed, there's always competition. In case for notify, you choose to let the competition happen in blocking state. in another case, you let the competition happen in running state.

So for those people who has ever said that notifyAll is better than notify, I did't see any proof yet!

For wait, wait is just designed for working together with notify and notifyAll. wait() put the threads into the waiting queue, and notify, notifyAll get them out of the queue(notify can get one thread out of the queue, notifyAll can be all threads out of the queue, and, of course, put them into a new competition for the object lock).

For synchronized, there's nothing to do with the waiting status. so it also has nothing to do with the lock object's waiting queue. it just put the threads into the runnable state(or do nothing, just keep looping for trying to acquire the lock) so that they can be scheduled anytime for resume, maybe keep looping for acquiring the lock, maybe continue the inside part of the synchronized block after acquired the lock.

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!