廖雪峰Java11多线程编程-3高级concurrent包-1ReentrantLock
2024-08-28 10:12:58
1.java.util.concurrent
线程同步:
- 是因为多线程读写竞争资源需要同步
- Java语言提供了synchronized/wait/notify来实现同步
- 编写多线程同步很困难
所以Java提供了更高级的java.util.concurrent包:
- 更高级的同步功能
- 简化多线程程序的编写
- JDK>= 1.5
2.ReetrantLock
java.util.locks.ReentrantLock用于替代synchronized加锁
synchronized是Java语言层面提供的,不需考虑异常
ReentrantLock是普通的Java类,要用try...finally来保证锁能够正确释放
当我们使用ReenTrantLock的时候,我们首先要通过new ReentrantLock()新建一个Lock对象。然后我们先试图用lock()方法获得当前对象的锁。如果我们获得锁成功,就进入try代码,最后在finally中用unlock()来释放这个锁。
注意:lock()方法必须在try代码之外完成。因为lock()可能会失败,而unlock()一定要在finally中完成。
class Count{
final Lock lock = new ReetrantLock(); //获得ReentrantLock对象
public void inc(){
lock.lock(); //获得当前对象的锁可能会失败,所以要放在try...finally外面
try{
n = n + 1;
}finally{
lock.unlock(); //释放锁
}
}
ReentrantLock:
- 可重入锁,一个线程可多次获取同一个锁
- lock()方法可获取锁
- tryLock()方法可尝试获取锁并可指定超时。
class Counter{
final Lock lock = new ReentrantLock();
private void inc() throws InterruptedException{
if(lock.tryLock(1, TimeUnit.SECONDS)){
try{
n = n + 1;
}finally {
lock.unlock();
}
}
}
}
使用ReentrantLock比直接使用synchronized更安全,因为synchronized会导致线程要么获得锁,要的永远等待下去。而使用ReentrantLock的时候,我们通过tryLock()在失败的时候不会导致死锁。
3.示例
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.Lock;
class Counter{
private Lock lock = new ReentrantLock();
private int value = 0;
public void add(int m){
lock.lock();
try{
value += m;
}finally {
lock.unlock();
}
}
public void dec(int m){
lock.lock();
try{
value -= m;
}finally {
lock.unlock();
}
}
public int get(){
lock.lock();
try{
return this.value;
}finally {
lock.unlock();
}
}
}
public class Main{
final static int LOOP = 100;
public static void main(String[] args) throws Exception{
Counter counter = new Counter();
Thread t1 = new Thread(){
public void run(){
for(int i=0;i<LOOP;i++){
counter.add(1);
}
}
};
Thread t2 = new Thread(){
public void run(){
for(int i=0;i<LOOP;i++){
counter.dec(1);
}
}
};
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(counter.get());
}
}
4.总结:
- ReentrantLock可以替代synchronized
- ReentrantLock获取锁更安全
- lock()获取锁在try...finally之前
- 必须使用try... finally保证释放锁
最新文章
- 基于 Annotation 拦截的 Spring AOP 权限验证方法
- iOS开发中多线程间关于锁的使用
- 发现IE6的一个BUG,添加受信任站点后,页面无法跳转
- 清空form表单下所有的input值-------------jquery
- ajax简单案例:返回json型
- Mongodb 级联删除查询操作
- NS记录
- Key Task
- [Locked] Unique Word Abbreviation
- mac下设置命令别名
- 使用hibernate 分表做增删改查
- check the manual that corresponds to your MySQL server version for the right syntax的错误解析
- HDU1754 I hate it(线段树 单点修改)
- java中的时间类型
- Linux 进程同步和通信
- 递归 + OS模块
- PyCharm 新建文件时默认添加作者时间等
- [Linux]《鸟哥的私房菜》笔记 (缓慢更新)
- LOJ#2632. 「BalticOI 2011 Day1」打开灯泡 Switch the Lamp On
- BEGIN-2_蓝桥杯_序列求和