日期:2014-05-20  浏览次数:20673 次

在调用obj.wait()前为什么要先得到obj的monitor
大家好,我基本清楚wait,sleep,notify,notifyall的用法,所以请不要介绍多线程编程方法。
我想知道的是为什么要有这条规则?如果事先没有得到obj的monitor,会带来什么恶果?
还有一个关于这个问题的子问题,就是什么是monitor?


------解决方案--------------------
1 你可以自己测试
2 sleep 好像不需用monitor
3 wait ? 这个类等待了,如果有另一个线程也使用了这个类怎么办? 一个类等待2次吗?

我一般这样写
synchronized(this){
this.wait(); // 这样就没问题了
}
------解决方案--------------------
wait()和notify()或notifyAll()必须配合synchronized使用,如果要进入synchronized模块,必须要得到相应的monitor,wait()的作用就是为了释放monitor,如果他没有得到monitor,它又要释放什么呢?
------解决方案--------------------
java的monitor支持两种类型的线程同步:互斥和合作
被虚拟机所支持的互斥是通过对象锁(object locks)来保证多线程使用共享数据而无互相干涉
------解决方案--------------------
A monitor is like a building that contains one special room that can be occupied by only one thread at a time.
监视器就像拥有一间特殊房间的大楼 
同一时间只能被一个线程所占有
进入大楼被称作进入监视器
进入房间被称作获得监视器
占有房间被称作拥有监视器
离开房间被称作释放监视器
离开大楼被称作离开监视器
------解决方案--------------------
你可以理解成每个类都是monitor,它负责监视自己的东西
在类里面的方法或是块用synchronized{...}那这里面的东西就要被同步了
传说中的监视者模式,我这样说对吗?