public class LockTest01 {
private Lock lock = new ReentrantLock();
public static void main(String[] args) throws InterruptedException {
/**
* Lock锁 获取锁和释放锁 需要开发人员自己定义
*/
LockTest01 lockTest01 = new LockTest01();
lockTest01.print();
Thread.sleep(500);
lockTest01.print2();
}
public void print() {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "开始获取Lock锁");
//获取锁
lock.lock();
System.out.println(Thread.currentThread().getName() + "获取Lock锁成功");
}
},"r1").start();
}
public void print2() {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "开始获取Lock锁");
//获取锁
lock.lock();
System.out.println(Thread.currentThread().getName() + "获取Lock锁成功");
}
},"r2").start();
}
}
此代码思路是当print()方法获取Lock锁时,print2()方法能否获取到Lock锁.
通过控制台可以发现,当print()方法获取到Lock锁的时候,print2()方法是无法获取到Lock锁的.
那么,我们如何才能让print2()获取到锁呢?下面上代码…
public class LockTest02 {
private Lock lock = new ReentrantLock();
public static void main(String[] args) throws InterruptedException {
/**
* Lock锁 获取锁和释放锁 需要开发人员自己定义
*/
LockTest02 lockTest02 = new LockTest02();
lockTest02.print();
Thread.sleep(500);
lockTest02.print2();
}
public void print() {
new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + "开始获取Lock锁");
//获取锁
lock.lock();
System.out.println(Thread.currentThread().getName() + "获取Lock锁成功");
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
},"r1").start();
}
public void print2() {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "开始获取Lock锁");
//获取锁
lock.lock();
System.out.println(Thread.currentThread().getName() + "获取Lock锁成功");
}
},"r2").start();
}
}
此处代码与先前代码唯一不同的地方是在print()方法中调用了unLock()方法,他的意思的就是释放Lock锁,也就是说当print()方法释放了Lock锁之后,print2()方法才能获取到Lock锁,由此也可以发现,Lock锁是需要我们开发人员去手动获取和释放的!