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){
}
}
是一样的效果
欢迎拍砖!!!!!!!!
有不同意见提出且正确者,买彩票中大奖!