Java中synchronized详解

时间:2021-08-14 16:32:32

synchronized

原则:

  1. 尽量避免无谓的同步控制,同步需要系统开销,可能造成死锁
  2. 尽量减少锁的粒度

同步方法

public synchronized void printVal(int v)
 {
  while(true)
   System.out.println(v);
 }
  1. 同步方法锁的是对象。类中有一个同步方法,这个方法可以被两个不同的线程同时执行,只要每个线程自己创建一个的该类的实例即可。
  2. 要实现类的同步,两种方式:
    • 方法中添加synchronized(ClassName.class)类锁,无论多少个实例,此方法只有一个线程可以执行。
    • 添加静态成员private static Object lock=new Object();并锁住synchronized(lock)。
  3. 如果一个对象有多个synchronized方法,只有一个线程访问了其中一个同步方法,那么其他的同步方法也会被锁住。
  4. 静态同步方法对所有实例起作用,synchronized static aStaticMethod{}。
  5. 同步方法不可继承,需要显示指定是否为同步方法。

同步块

synchronized(this) //作用域是当前对象
{/*区块*/}
  1. 作用于方法中的某个部分,表示此部分资源互斥访问。
  2. 一个线程访问同步块时,其他线程可以访问非synchronized(this)同步代码块。
  3. 当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。

参考这里