JAVA中Synchronized(对象锁)和Static Synchronized(类锁)

pulbic class Something(){  
    public synchronized void isSyncA(){}  
    public synchronized void isSyncB(){}  
    public static synchronized void cSyncA(){}  
    public static synchronized void cSyncB(){}  
}  

static加synchronized就是类锁,通常就相当于Something.cSyncA()这样来调用

a. x.isSyncA()与x.isSyncB()   都是对同一个实例(x)的synchronized域访问,因此不能被同时访问。
b. x.isSyncA()与y.isSyncA()   是针对不同实例的,因此可以同时被访问(对象锁对于不同的对象实例没有锁的约束)
c. x.cSyncA()与y.cSyncB()     因为是static synchronized,所以不同实例之间仍然会被限制,相当于Something.isSyncA()与 Something.isSyncB()了,因此不能被同时访问。
d. x.isSyncA()与Something.cSyncA()  这里是关键,会同时被访问,这里的类锁和对象锁并不冲突

结论:

A: synchronized static是某个类的范围,synchronized static cSync{}防止多个线程中多个实例同时访问这个 类中的synchronized static 方法。它可以对类的所有对象实例起作用。
B: synchronized 是某实例的范围,synchronized isSync(){}防止多个线程中这一个实例同时访问这个类的synchronized 方法。

简单描述:

若类对象被lock,则类对象的所有同步方法全被lock;也就是所有的静态方法
若实例对象被lock,则该实例对象的所有同步方法全被lock,应该不能是静态方法

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

对于synchronized(this){}要记住必须是同一个对象才会有效

这里有时候会synchronized(Object o){}这样写,这里传入的对象也必须是同一个,这样同步的方法才会有用

同样的synchronized(Something.class){}和static synchronized也是没什么区别,你也可以把这段代码块当做是对整个类的锁

参考:

https://blog.csdn.net/cs408/article/details/48930803

https://blog.csdn.net/linlvting1314/article/details/79325828

猜你喜欢

转载自www.cnblogs.com/smallJunJun/p/10310450.html