再美不及姑娘你
又见西风上碧树
posts - 135,comments - 7,views - 48056

一、Lock锁

虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock

Lock实现提供比使用synchronized方法和语句更广泛的锁定操作

二、Lock中提供了获得锁和释放锁的方法

1.void lock():获得锁

2.void unlock();释放锁

Lock由于是接口,不能直接实例化,这里采用它的实现类ReentrantLock来实例化

三、ReentrantLock的构造方法

ReentrantLock():创建一个ReentrantLock的实例

例如:之前的卖票案例就可以这样写

public class SellTicket implements Runnable {
  //定义总张数
  private int tickets = 100;
  //定义Lock锁,要用它的实现类完成
  Lock lock=new ReentrantLock();
  @Override
  public void run() {
      while (true) {
          //判断车票是否大于0
          //加锁
          lock.lock();
          if (tickets > 0) {
              System.out.println(Thread.currentThread().getName() + "卖出第" + tickets + "张车票");
              tickets--;
              //模仿出票
              try {
                  sleep(100);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }          
              }
          //释放锁
          lock.unlock();            
      }
  }
}

为了避免出现有时候出现异常不能及时释放锁的情况,我们用try...finally来操作一下

package Demo041901;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import static java.lang.Thread.sleep;
public class SellTicket implements Runnable {
  //定义总张数
  private int tickets = 100;
  //定义Lock锁,要用它的实现类完成
  Lock lock=new ReentrantLock();
  @Override
  public void run() {
      while (true) {
          //判断车票是否大于0
          try {
              //加锁
              lock.lock();
              if (tickets > 0) {
                  System.out.println(Thread.currentThread().getName() + "卖出第" + tickets + "张车票");
                  tickets--;
                  //模仿出票
                  try {
                      sleep(100);
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
              }else {
                  break;
              }
          }finally {
              //释放锁
              lock.unlock();
          }
      }
  }
}
 
posted on   再美不及姑娘你  阅读(1307)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示