ReentrantLock类的使用

/ 多线程 / 没有评论 / 295浏览

我们知道在多线程开发中可以用synchronized同步关键字来解决线程的安全问题,在其它文章中我们已经做了相应的介绍,从今天开始我们介绍其它的方法来解决线程的安全问题,那就是用ReentrantLock。ReentrantLock是JDK1.5以后新增的,它和synchronized同步关键字相比在扩展上更加强大,也更加灵活。下面我们先看一下它的简单使用。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
* 用户登录
*
* @author Sama
* @author admin@jilinwula.com
* @date 2017-03-15 10:35
* @since 1.0.0
*/
public class Userinfo {

private Lock lock = new ReentrantLock();

public void test() {
lock.lock();
for (int i = 1; i < 5; i++) {
System.out.println(String.format("i: %s\tthread: %s", i, Thread.currentThread().getName()));
}
lock.unlock();
}
}
/**
* 管理用户请求
*
* @author Sama
* @author admin@jilinwula.com
* @date 2017-03-15 10:44
* @since 1.0.0
*/
public class RequestAdmin extends Thread {

private Userinfo userinfo;


public RequestAdmin(Userinfo userinfo) {
this.userinfo = userinfo;
}

@Override
public void run() {
userinfo.test();
}
}
/**
* @author Sama
* @author admin@jilinwula.com
* @date 2017-03-20 13:35
* @since 1.0.0
*/
public class Test {
public static void main(String[] args) throws InterruptedException {
Userinfo userinfo = new Userinfo();
RequestAdmin requestAdmin = new RequestAdmin(userinfo);
RequestAdmin requestAdmin2 = new RequestAdmin(userinfo);
requestAdmin.start();
requestAdmin2.start();
}
}
i: 1	thread: Thread-0
i: 2	thread: Thread-0
i: 3	thread: Thread-0
i: 4	thread: Thread-0
i: 1	thread: Thread-1
i: 2	thread: Thread-1
i: 3	thread: Thread-1
i: 4	thread: Thread-1

我们看输出是同步执行的,这就是说明线程一在执行的时候先获取到了对象的锁,只有当它执行完时,才把锁释放,这时其它线程才可以重新获取锁,在执行。

lock.lock(); // 使当前线程获取到锁
lock.unlock(); // 使当前线程释放获取到的锁

这就是ReentrantLock类的简单使用,下一篇我们将介绍怎么用ReentrantLock类来实现wait()和notify()方法的功能。