java 中主要锁的区别及使用场景
synchronized
synchronized 是属于声明式加锁,可以修饰一个代码块、一个方法、一个类,一个静态方法。
// 修饰一个代码块
public void test1(int j) {
synchronized (this) {
for (int i = 0; i < 10; i++) {
log.info("test1 {} - {}", j, i);
}
}
}
// 修饰一个方法
public synchronized void test2(int j) {
for (int i = 0; i < 10; i++) {
log.info("test2 {} - {}", j, i);
}
}
// 修饰一个类
public static void test1(int j) {
synchronized (SynchronizedExample2.class) {
for (int i = 0; i < 10; i++) {
log.info("test1 {} - {}", j, i);
}
}
}
// 修饰一个静态方法
public static synchronized void test2(int j) {
for (int i = 0; i < 10; i++) {
log.info("test2 {} - {}", j, i);
}
}
synchronized 是在jvm层面实现的,不但可以通过一些监控工具监控,而且出现系统异常了,jvm也会自动的解锁,所以jvm会自动的做加锁与解锁操作,其用法对开发人员是完全透明的。
ReentrantLock
ReentrantLock 是对象层面的锁,需要手动的加锁和解锁。在加解锁时机有了更灵活的选择,并且提供了公平选择和非公平选择。
// 请求总数
public static int clientTotal = 5000;
// 同时并发执行的线程数
public static int threadTotal = 200;
public static int count = 0;
private final static Lock