ReentrantLock(互斥锁,可重入锁)
使用:
ReentrantLock reentrantLock = new ReentrantLock();
reentrantLock.lock();//拿锁
boolean res = reentrantLock.tryLock();//拿到锁返回true,没拿到返回false
boolean res = reentrantLock.tryLock(100,TimeUnit.SECONDS);//100秒内拿到锁返回true,否则没拿到返回false
reentrantLock.unlock();//释放锁
例:
不使用ReentrantLock:
public class MyRunnable implements Runnable {
private Integer id = 0;
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("我是 " + Thread.currentThread().getName() + " 的id: " + (++id));
}
}
}
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
for (int i = 0; i < 50; i++) {
new Thread(myRunnable).start();
}
}
结果:
...
我是 Thread-27 的id: 4992
我是 Thread-27 的id: 4993
我是 Thread-27 的id: 4994
我是 Thread-48 的id: 4984
我是 Thread-48 的id: 4995
我是 Thread-19 的id: 4983
Process finished with exit code 0
使用ReentrantLock:
public class MyRunnable implements Runnable {
private Integer id = 0;
private ReentrantLock reentrantLock;
public MyRunnable(ReentrantLock reentrantLock) {
this.reentrantLock = reentrantLock;
}
@Override
public void run() {
try {
if (reentrantLock.tryLock(10, TimeUnit.SECONDS)) {
for (int i = 0; i < 100; i++) {
System.out.println("我是 " + Thread.currentThread().getName() + " 的id: " + (++id));
}
reentrantLock.unlock();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
ReentrantLock reentrantLock = new ReentrantLock();
Object o = new Object();
MyRunnable myRunnable = new MyRunnable(reentrantLock);
for (int i = 0; i < 50; i++) {
new Thread(myRunnable).start();
}
}
结果:
...
我是 Thread-48 的id: 4996
我是 Thread-48 的id: 4997
我是 Thread-48 的id: 4998
我是 Thread-48 的id: 4999
我是 Thread-48 的id: 5000
Process finished with exit code 0