关于static synchronized与synchronized

徘徊边缘 提交于 2020-01-31 07:24:09

1.示例题目

pulbic class Something(){
          public synchronized void isSyncA(){}
          public synchronized void isSyncB(){}
          public static synchronized void cSyncA(){}
          public static synchronized void cSyncB(){}
}
    那么,加入有Something类的两个实例a与b,那么下列组方法何以被1个以上线程同时访问呢
    a.   x.isSyncA()与x.isSyncB() 
    b.   x.isSyncA()与y.isSyncA()
    c.   x.cSyncA()与y.cSyncB()
    d.   x.isSyncA()与Something.cSyncA()
 

 a,都是对同一个实例的synchronized域访问,因此不能被同时访问

 b,是针对不同实例的,因此可以同时被访问
 c,因为是static synchronized,所以不同实例之间仍然会被限制,相当于Something.isSyncA()与   Something.isSyncB()了,因此不能被同时访问。
 那么,第d呢?,书上的 答案是可以被同时访问的,答案理由是synchronzied的是实例方法与synchronzied的类方法由于锁定(lock)不同的原因。

2.synchronized方法与synchronized代码快的区别
synchronized methods(){} 与synchronized(this){}之间没有什么区别,只是 synchronized methods(){} 便于阅读理解,而synchronized(this){}可以更精确的控制冲突限制访问区域,有时候表现更高效率。

3.synchronized不能继承,子类的覆盖方法必须显示的将其定义成synchronized,此时,子类调用父类的方法属于内部锁,内部锁可重入

写代码得多加注意,多加注意 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!