一,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++;
}
}