线程最大的缺点就是不可知,易出错(你千万不要以为自己弄懂了).
其实同步保护的作用在方法执行完毕后也就失去了,通过notify()可以协调线程之间的作用,它的确需要一些开销.但是,如果你不使用,那么有可能出现线程之间的冲突(注意,是有可能).所以作为一个程序,安全性和健壮性是非常重要的
其实同步保护的作用在方法执行完毕后也就失去了,通过notify()可以协调线程之间的作用,它的确需要一些开销.但是,如果你不使用,那么有可能出现线程之间的冲突(注意,是有可能).所以作为一个程序,安全性和健壮性是非常重要的
notifyAll()让等待某个对象K的所有线程离开阻塞状态,
notify()随机地选取等待某个对象K的线程,让它离开阻塞状态。
在线程1中执行如下代码
...
synchronized(obj1) //1.进入同步块
{
try {
...
obj1.wait(); //2.进入暂停状态
}catch (InterruptedException exp) {}
}1.当前同步对象(monitor)为obj1,obj1是任一实例,若是同步方法,则同步对象是this.进入同步块后,obj1为锁定状态,锁定状态对obj1本身无任何影响,而其它线程执行到同一代码时,因不能获得锁,处于Block状态,一旦解锁,被block的线程自动继续执行.
2.调用obj1.wait()有两个作用,一是使线程进入等待状态,二是解锁obj1,这时被block的线程将获得锁.线程1要退出等待必须要由其它线程显式的调用obj1.notify()或notifyAll()方法.如...
synchronized(obj1)
{
...
obj1.notify(); //3. 向wait的线程发通知信息
...
}
...若其它线程执行到此时,线程1处于wait状态,则wait状态解除,解除后,若线程1若得到锁就能继续执行,若有多个线程处于obj1的wait状态,notify将随机选一个线程激活,而notifyAll是同时解除所有的wait状态.
一个简单的例子:
thread1 receive data
thread2 pase received data
lockObj是buf
当buf中没有数据时,thread2中调用buf.wait释放锁,让thread1有机会执行。
当thread1收到数据时,调用buf.notify()通知thread1去处理收到的数据。
我做的实验好象能证明这一点,所以我就不明白,既然不调用notify也能给其他线程使用对象的机会,那么调用和不调用notify的区别究竟在哪里?
网友 hh_fwhy(凤舞凰扬) 的回答颇令我满意,但是我希望得到的答案能量化一点。如果今晚之前还没有其他高手帮忙,那么这就结分啦。