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

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){

 

    }

}

是一样的效果

 

 

 

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

 

有不同意见提出且正确者,买彩票中大奖!

发布了13 篇原创文章 · 获赞 2 · 访问量 2万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览