Lock与锁的资源关闭
- Lock
- try..catch..finally实现锁的资源释放
在前面我们使用synchronized关键字实现了锁的效果,但是这个实现的锁是自动开启和自动释放的。在jdk5的时候java提供了Lock可以手动时候锁的关闭和释放
package com.cook.test;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
//实现卖票操作(实现Runnable接口实现)
public class MyThread3 implements Runnable {
//定义票数并共享
public static int ticket = 0;
static ReentrantLock lock = new ReentrantLock();//定义锁并保证锁对象的唯一
@Override
public void run() {
while (true){
lock.lock();//上锁
if(ticket<100){
ticket++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(Thread.currentThread().getName()+"已经卖了"+ticket+"张票"+"还剩下"+(100-ticket)+"张票");
}else {
break;
}
lock.unlock();//关锁
}
}
}
package com.cook.test;
public class MyThreadTest3 {
public static void main(String[] args) {
MyThread3 t = new MyThread3();
Thread t1 = new Thread(t,"窗口1");
Thread t2 = new Thread(t,"窗口2");
Thread t3 = new Thread(t,"窗口3");
t1.start();
t2.start();
t3.start();
}
}
以上代码大的问题没有,只是一直运行发现程序一直没有结束
进行我们对代码的分析可以知道:当ticket==100的时候会执行breaks语句,而没有执行unLock(开锁),而后面的2条线程会一直在锁外面进行等待。本质就是锁的资源没有进行释放
锁资源也是一种物理资源,是一定要被释放的。可以利用try...catch...finally来控制资源的释放
try...catch...finally
在finally中的代码一定会被执行
package com.cook.test;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
//实现卖票操作(实现Runnable接口实现)
public class MyThread3 implements Runnable {
//定义票数并共享
public static int ticket = 0;
static ReentrantLock lock = new ReentrantLock();//定义锁并保证锁对象的唯一
@Override
public void run() {
while (true){
try {
lock.lock();
if(ticket<100){
Thread.sleep(100);
ticket++;
System.out.println(Thread.currentThread().getName()+"正在卖出第"+ticket+"张票 还剩下"+(100-ticket)+"张票");
}else {
break;
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
lock.unlock();
}
}
}
}
ok了
`