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了

`

posted @ 2023-03-07 20:40  一往而深,  阅读(39)  评论(0编辑  收藏  举报