java synchronized的一些知识

  synchronized是对类的当前实例进行加锁,防止其他线程同时访问该类的该实例的synchronized块,注意是“类的当前实例”,类的两个不同实例就没这种约束了。

       static synchronized是要控制类的所有实例的访问,static synchronized可以实现对类的多个实例的加锁功能。

      《java多线程设计模式》有这样的一个例子:

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

  那么,假如有Something的2个实例a和b,下面的那个选项是2个线程可以同时访问呢

a. x.isSyncA()与x.isSyncB()
b. x.isSyncA()与y.isSyncB()
c. x.cSyncA()与y.cSyncB()
d. x.isSyncA()与Something.cSyncA()

  可以有下面的判断:

  a. 都是对同一个实例的synchronized域访问,是同一个所对象,不能同时访问

  b. 针对的是不同的实例,不同的锁对象,可以同时访问

  c. static synchronized,不同实例仍会被限制,等同于Something.cSyncA()与Something.cSyncB(),不能同时访问

  d. 可以同时访问,synchronized的是实例方法与synchronized的类方法的锁的对象是不同的

  static方法可以被多线程同时访问的,只要没使用static成员变量就是线程安全的,常用于工具类。

       static synchronized无法被多线程同时访问,要注意性能上的问题。

原文地址:https://www.cnblogs.com/lnlvinso/p/13550992.html