先上代码
package time.task.excutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantDemo {
public static void main(String[] args) {
Lock lock = new ReentrantLock();
MyThread2 myThread2 = new MyThread2(lock);
MyThread2 myThread = new MyThread2(lock);
myThread2.start();
myThread.start();
}
}
class MyThread2 extends Thread{
private final Lock lock ;
public MyThread2(Lock lock) {
this.lock=lock;
super.setName("MyThread2");
}
@Override
public void run () {
try {
lock.tryLock(3,TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("执行了方法");
}
}
运行后结果为:
先输出一次“执行了方法”,3秒后再输出一次“执行了方法”
将lock.tryLock(3,TimeUnit.SECONDS);改为 lock.lock();
上代码
package time.task.excutor;
//import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantDemo {
public static void main(String[] args) {
Lock lock = new ReentrantLock();
MyThread2 myThread2 = new MyThread2(lock);
MyThread2 myThread = new MyThread2(lock);
myThread2.start();
myThread.start();
}
}
class MyThread2 extends Thread{
private final Lock lock ;
public MyThread2(Lock lock) {
this.lock=lock;
super.setName("MyThread2");
}
@Override
public void run () {
//try {
//lock.tryLock(3,TimeUnit.SECONDS);
lock.lock();
//} catch (InterruptedException e) {
// e.printStackTrace();
//}
System.out.println("执行了方法");
}
}
运行后结果为:
先输出一次“执行了方法”,然后控制台会一直阻塞
总结:
ReentrantLock是Lock的常用实现类,lock.lock()是以lock对象为锁,代码中使用的同一个lock对象,所以使用的是同一把锁,一个线程通过lock()方法拿到了锁,执行了System.out.println("执行了方法");打印出结果,之后没有调用lock.unlock()方法,所以没有释放锁,第二个线程在调用lock.lock()控制台就一直阻塞在那,说明lock.lock()是一个阻塞方法,而lock.tryLock()是不同,他是一个有返回值的方法,在没有设置longTime和TimeUnit时,即试图获取锁,没有获取到就返回false,获取到就返回true,这个方法是立即返回的,当你调用lock.lock(long time,TimeUnit unit),意思就是 在指定时间范围内阻塞,规定时间范围内获取到锁就返回true,否则就返回false,注意:如果在当前线程中以将中断表示位设为true,例如Thread.currentThread().interrupt();执行lock.lock(long time,TimeUnit unit)就会报java.lang.InterruptedException异常