java中的锁
1. 重量级锁 synchronized , 是重入锁
可以修饰方法,或者锁对象
// 锁方法
synchronized void aaa() {
count++;
}
// 锁对象
void aaa() {
synchronized (Abc.class) {
count++;
}
}
2. ReentrantLock 是重入锁
import java.util.concurrent.locks.ReentrantLock;
public class Abc {
int count = 0;
private final ReentrantLock lock = new ReentrantLock();
void aaa() {
try {
lock.lock();
// 超时还没获得锁就抛异常
// lock.tryLock(1, TimeUnit.MICROSECONDS);
// lock.lockInterruptibly(); // 获取锁,并一直等待,但等待过程中线程可以被中断
count++;
} finally {
lock.unlock();
}
}
void ccc() {
try {
lock.lock();
count++;
// 测试 ReentrantLock 是否为重入锁,可以执行,所以是重入锁
try {
lock.lock();
count++;
} finally {
lock.unlock();
}
} finally {
lock.unlock();
}
}
}
3. ReentrantReadWriteLock 读写锁
public class Abc {
int count = 0;
private final ReentrantLock lock = new ReentrantLock();
// 读写锁
final ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
final ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock();
final ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock();
void aaa() {
try {
writeLock.lock();
// 超时还没获得锁就抛异常
// writeLock.tryLock(1, TimeUnit.MICROSECONDS);
// writeLock.lockInterruptibly(); // 获取锁,并一直等待,但等待过程中线程可以被中断
count++;
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
writeLock.unlock();
}
}
}
简单的代码demo
查看代码
import java.util.concurrent.locks.ReentrantLock;
public class Abc {
int count = 0;
private final ReentrantLock lock = new ReentrantLock();
void aaa() {
try {
lock.lock();
count++;
} finally {
lock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
final Abc a = new Abc();
// 建4条线程,调用aaa() 方法
for (int i = 0; i < 4; i++) {
Thread thread = new Thread(() -> {
for (int j = 0; j < 10000; j++) {
a.aaa();
}
});
thread.start();
}
Thread.sleep(3000); // 睡一段时间,上面的线程都执行完
System.out.println("a.count = " + a.count);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)