Java-synchronized

synchronized是java的关键字(内置的),Lock是java的接口。两者都实现了对于临界资源的同步互斥访问,各有优缺点。

1.简介

synchronized的使用对象主要有两大类:

  • 静态:类、类方法。
  • 非静态:对象,对象方法。

当多个线程访问了同一个被synchronized修饰的内容时,只有最先获取该内容的锁,其他线程只能等待该线程释放锁(等待或结束)后才能获取该内容的锁。也就是该内容在一段时间内只能被一个线程所拥有。

线程释放锁的情况有三种:

  • 正常执行完被锁的内容,线程释放锁
  • 执行被锁的内容时发生异常,JVM释放锁
  • 进入等待状态(调用wait()方法等),线程释放锁

2.使用

2.1 作用于对象

//代码块
synchronized(this){
  //...
}

//指定对象
synchronized(obj){
  //...
}

//特殊对象,没有明确对象时
private byte[] lock = new byte[0];//特殊对象
......
synchronized(lock){
  //...
}

2.2 作用于方法

//对象方法
public synchronized void method(){
  //...
}
或
public synchronized void method(){
  synchronized(this){
    //...
  }
}

//静态方法
public synchronized static void method(){
  //...
}

2.3 作用于类

synchronized(Clazz.class){
  //...
}

注意

  • synchronized无法被继承,被重写的方法无法同步,父类的方法是同步的。
  • 修饰对象或对象方法时,只在该对象同步,该类的所有对象之间不保持同步。

你可能感兴趣的:(Java-synchronized)