作用

synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性

修饰的对象

  1. 修饰代码块,作用范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象
  2. 修饰方法,作用范围是整个方法,作用的对象是调用这个方法的对象
  3. 修饰静态方法,作用范围是整个静态方法,作用的对象是这个类的所有对象
  4. 修饰类,作用范围是synchronized后面括号括起来的部分,作用的对象是这个类的所有对象

注意

  1. 当一个线程访问对象的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该对象中的非synchronized(this)同步代码块。

  2. 当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。

  3. synchronized关键字不能继承。
    对于父类中用synchronized 修饰的方法,子类在覆盖该方法时,默认情况下不是同步的,必须显式的使用 synchronized 关键字修饰才行, 当然子类也可以直接调用父类的方法, 这样就间接实现了同步.

  4. 在定义接口方法时不能使用synchronized关键字。

  5. 构造方法不能使用synchronized关键字,但可以使用synchronized代码块来进行同步。

  6. 离开同步代码块后,所获得的锁会被自动释放。