Java synchronized

小记

  • synchronized可作用于instance变量、对象引用、static函数和class上。
  • 每个对象只有一个锁(lock)与之相关联。每一个类也对应一把锁,因此也可将类的静态成员函数声明为 synchronized,以控制其对的静态成员变量的访问,注意这里会锁在“类”上,而不是实例上。

  • synchronized:三个线程(包括main线程)试图进入某个类的三个不同的方法的同步块中,虽然这些同步块处在不同的方法中,但由于是同步到同一个对象(如synchronized (this)),所以对它们的方法依然是互斥的。 但对于以下同步到三个不同的对象,则对临界资源的访问是独立的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Object o1 = new Object();
    Object o2 = new Object();

    void m1(){
    synchronized (this) {
    //..
    }
    }
    void m2(){
    synchronized (o1) {
    //..
    }
    }
    void m3(){
    synchronized (o2) {
    //..
    }
    }

synchronized使用

  • synchronized method(){} 对该类的同一个对象来说,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法。而不同的对象则是互不干扰的。
  • synchronized static method{} 对该类的所有对象起作用。
  • synchronized关键字是不能继承的

synchronized实现原理

待续。