synchronized的用法

 一,synchronized的作用:

  • synchronized 是同步锁,用来实现互斥同步。

  • 在 Java 中,关键字 synchronized 可以保证在同一个时刻,只有一个线程可以执行某个方法或者某个代码块。

二, 用法

synchronized 包括三种用法:

  • 修饰方法
  • 修饰静态方法
  • 修饰代码块

·

2.1 修饰方法

        多线程环境下,每次只能有一个线程访问该方法。

示例:

public synchronized void increase() {
    i++;
}

·

2.2 修饰静态方法

        当 synchronized 作用于静态方法时,其锁住的就是当前整个类的 class 对象。

public static synchronized void increase() {
    i++;
}

需要注意的是:

        如果一个线程 A 调用一个实例对象的非 static静态 synchronized 方法,而线程 B 需要调用这个实例对象所属类的 static静态 synchronized 方法,是允许的,不会发生互斥现象,

        因为访问静态 synchronized 方法锁住的是当前类的 class 对象,而访问非静态 synchronized 方法锁住的是当前实例对象,二者的锁并不一样,所以不冲突。

·

2.3 修饰代码块

        在某些情况下,我们编写的方法体可能比较大,同时存在一些比较耗时的操作,而需要同步的代码又只有一小部分,如果直接对整个方法进行同步操作,可能会得不偿失,此时我们可以使用同步代码块的方法对需要同步的代码进行包裹,这样就无需对整个方法进行同步操作了。

        我们可以使用如下几种对象来作为锁的对象:

2.3.1,成员锁

        锁住的对象是变量a1指向的对象:

public Object synMethod(Object a1) {
    synchronized(a1) {
        // 操作
    }
}

2.3.2,this

        this 代表当前实例对象,锁住的是当前实例;

synchronized(this) {
    for (int j = 0; j < 100; j++) {
		i++;
    }
}

2.3.3,.class

        锁住的是当前类的 class 对象锁

synchronized(AccountingSync.class) {
    for (int j = 0; j < 100; j++) {
        i++;
    }
}