synchronized修饰实例方法
以下两种写法作用和意义相同
public class Foo {
// 实例方法
public synchronized void doSth1() {
// 获取this锁,才能执行该方法
}
// 实例方法
public void doSth2() {
synchronized(this) {
// 获取this锁,才能执行该代码块
}
}
}
public static void main(String[] args) {
// 实例化一个对象
Foo fa = new Foo();
// 创建不同的线程1
Thread thread01 = new Thread() {
public void run() {
// 使用相同的对象访问synchronized方法
fa.doSth1();
}
};
// 创建不同的线程2
Thread thread02 = new Thread() {
public void run() {
// 使用相同的对象访问synchronized方法
fa.doSth1();
}
};
// 启动线程
thread01.start();
thread02.start();
}
synchronized修饰静态方法
以下两种写法作用和意义相同
public class Foo {
// 静态方法
public synchronized static void doSth1() {
// 获取当前对象的Class对象锁,才能执行该方法
}
// 实例方法
public static void doSth2() {
synchronized(this.getClass()) {
// 获取当前对象的Class对象锁,才能执行该代码块
}
}
}
public static void main(String[] args) {
// 创建不同的对象(相同类型)
Foo fa = new Foo();
Foo fb = new Foo();
// 创建不同线程1
Thread thread01 = new Thread() {
public void run() {
// 使用不同的对象访问synchronized方法
fa.doSth2();
}
};
// 创建不同线程2
Thread thread02 = new Thread() {
public void run() {
// 使用不同的对象访问synchronized方法
fb.doSth2();
}
};
// 启动线程
thread01.start();
thread02.start();
}
synchronized修饰代码块
synchronized(自定义对象) {
//临界区
}
Reentrantlock与synchronized的区别
使用synchronized重构代码:
public class Counter {
private int count;
public void add(int n) {
synchronized(this) {
count += n;
}
}
}
使用ReentrantLock重构代码:
public class Counter {
private final Lock lock = new ReentrantLock();
private int count;
public void add(int n) {
lock.lock();
try {
count += n;
} finally {
lock.unlock();
}
}
}