10. synchronized用法
大约 1 分钟
一、作用域
synchronized关键字的作用域有: 1.静态方法
public static synchronized void increase() {
count = count + 1;
}
2.实例方法
public synchronized int getCount() {
return count;
}
3.代码块
public static void decrease() {
synchronized (SynchronizedDemo.class) {
count = count - 1;
}
}
二、加锁对象
synchronized加锁的对象有: 1.锁定的对象为类类型 2.锁定的对象为类实例对象 例如:
public class SynchronizedDemo {
private static int count = 0;
//锁定对象为SynchronizedDemo.class
public static synchronized void increase() {
count = count + 1;
}
public static void decrease() {
//锁定对象为SynchronizedDemo.class
synchronized (SynchronizedDemo.class) {
count = count - 1;
}
}
//锁定对象为为SynchronizedDemo类的某个实例
public synchronized int getCount() {
return count;
}
public void print() {
//锁定对象为SynchronizedDemo类的某个实例
synchronized (this) {
System.out.println(count);
}
}
}
三、关键点
1.synchronized加锁互斥且阻塞的,如果A已经获得锁,则B要等A执行完后才能执行。 2.锁定的对象如果不是同一个则不会阻塞,例如在同一个类的静态方法和实例方法上都有synchronized关键字,但它们不是同一个锁,因此互不影响。 3.锁定的对象必须是不变的,否则锁会发生变化,导致并发时处理结果不正确。