Lock是java.util.concurrent.locks包下的一个接口
主要方法有:
Lock接口的实现类
Lock相关实现类还可以定义公平锁,如ReentrantLock(boolean)
package cn.itcats.thread.safe.Test1;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
//自增数字生成器
public class Sequence {
private int a;
//创建Lock接口锁
Lock lock = new ReentrantLock();
public int add() {
//获取锁
lock.lock();
int value = a++;
//释放锁
lock.unlock();
return value;
}
public static void main(String[] args) {
Sequence sequence = new Sequence();
new Thread(new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " " + sequence.add());
}
}
}).start();
new Thread() {
public void run() {
while (true) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " " + sequence.add());
}
};
}.start();
}
}
使用Lock接口解决了线程安全问题
关于Lock接口使用与synchronized使用的一些异同
- Lock需要显式通过API方法获取锁和释放锁,而synchronized关键字不需要显式获取锁和释放锁。
- Lock加锁和释放锁比sychronized加锁释放锁更灵活
- 使用Lock更方便实现公平性锁
- Lock可以实现非阻塞获取锁,能被中断地获取锁,超时获取锁(设定超时时间,超过时间未获取锁返回结果,规定时间内获取锁也返回结果)
- 总体来说Lock对synchronized进行了一些封装,比synchronized功能更强大