您的位置:首页 > 大数据 > 人工智能

synchronized使用和wait与notify的使用之我的理解

2010-12-24 13:52 363 查看
synchronized我的理解:
synchronized(obj)这个指定了对象的同步快中,obj会在线程进去时加锁,所以不会去理会这个同步块被哪个对象或哪个线程调用,只要有线程进去,则obj就加锁,然后其他所有线程都无法进去了,包括无法进入其他地方的synchronized(obj){}块(参数里的两个obj为同一个对象)

 

 

在执行wait和notify会释放锁,所以必须在同步块中执行

synchronized(obj){
 obj.wait()和
 wait()不同,前者释放锁,后者虽然也是释放锁,但却不是释放的obj对象的锁,而是this对象的锁,this对象!=obj对象,不在同步块中,哪来的锁呢,所以会报错
}

 

 

 

在synchronized(obj)块中,
当obj.wait()调用时,obj控制该线程的wait和notify,而其他对象不能控制,当obj.wait()时,obj所在的线程wait,并会释放锁,让其他线程进入synchronized区,若碰到obj.wait(),该线程又会等待并释放锁依此类推

 

当有线程调用obj.notify时也必须在同步块中,因为之前obj wait住了几个线程,所以需要obj去notify这几个线程

 

但是当一个线程被notify以后,这个obj又将获得锁,这个锁从哪里来呢?首先obj自己不能产生锁,必须由synchronized(obj)执行时提供给obj对象

 

这就是obj.notify要在同步块中的原因,而且还必须是synchronized(obj)不能是其他的如synchronized(obj2)之类的对象,obj.notify再执行的时候就obj对象再次加锁,被obj.wait处的线程再次启动,其他线程再次不能进入synchronized区

 

 

 

 

ps:之前学习的时候常常听见类似“线程所持有的对象”这些话。听起来太“专业”了听不懂,实际上就是synchronized(obj)中obj要相同。

同步方法:

 

synchronized method()
和method(){

    synchronized(this){

 

    }

}

是一样的效果

 

 

 

欢迎拍砖!!!!!!!!

 

有不同意见提出且正确者,买彩票中大奖!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐