类对象与实例对象 类对象通常用在静态函数上 eg: ```javva static synchronized void f(){ //bussis code } ``` note: 不要用子类的静态锁对父类静态域进行加锁操作。 The JVM internally obtains and releases the locks for Class objects during class loading and initialization.
实例对象: 有两种方式:代码块 or 函数 ```java void f() { synchronized(this) { /* body */ } } ``` 效果等同下面code ```java synchronized void f() { /* body */ } ``` note: 1.synchronized 不作为函数参数,不被子类继承和重写,interface函数不能使用synchronized。不建议在构造函数使用synchronized。 2.实例对象在父类和子类中,都是同一个锁对象(可重入锁) eg: ```java public class Parent { private int age;
public int getAge() { synchronized (this){ System.out.println(this);// result:com.chen.demo.Children@721e0f4f return age; } }
public void setAge(int age) { this.age = age; } }
public class Children extends Parent{ @Override public int getAge() { synchronized (this){ System.out.println(this);// result:com.chen.demo.Children@721e0f4f return super.getAge(); } } } ``` 3.内部类,与外部类是不一样的 eg: ```java public class InnerAndOuter {
public void getOuterMethod(){ synchronized (this){ System.out.println(this);//com.chen.demo.InnerAndOuter@546a03af } }
//在外部调用时,需要创建内部类实例对象,在调用对应加锁函数,效果和下面函数类似 public void getInnerMethod(){ Inner inner = new Inner(); inner.getMethod(); }
public class Inner { public void getMethod(){ synchronized (this){ System.out.println(this);//com.chen.demo.InnerAndOuter$Inner@28864e92 } } } } ``` 可以通过改变非静态内部类的锁对象实现内外部实例锁对象一致 eg: ```java public class InnerAndOuter {
public void getOuterMethod(){ synchronized (this){ System.out.println(this);//com.chen.demo.InnerAndOuter@546a03af } }
public class Inner { public void getMethod(){ synchronized (InnerAndOuter.this){ System.out.println(InnerAndOuter.this);//com.chen.demo.InnerAndOuter@546a03af } } } } ``` 锁有获取和释放两个配对操作。 有些显式调用获取锁的,需要显式释放;有些则不用。