线程lock(锁) 15

线程 Lock ( 锁 )

Lock(锁) :

           ReentrantLock类实现了Lock,它拥有与synchronized相同的并发性和内存语义,在实现线程安全的控制中,

           比较常用的是ReentrantLock,可以显示式加锁。

  • synchronized与Lock的对比:1. Lock是显示锁 ( 手动开启和关闭锁,别忘记关闭锁 ) synchronized是

                                                                隐式锁,出了作用域自动释放。

                                                            2. Lock只有代码块锁,synchronized有代码块锁和方法锁。

                                                            3. 使用Lock锁,JVM将花费较少的时间来调度线程,性能更好,

                                                                并且具有更好的扩展性(提供更多的子类) ( Lock(可重复锁))。

                                                            4.优先使用顺序:Lock> 同步代码块(已经进入方法体,分配了相应资源

                                                               )> 同步方法(在方法体之外)

 

class A
{
  private ReentrantLock = new ReenTrantLock();
   public void m()
  {
       lock.lock();//加锁
       try{
           //保证线程安代码。
      }
       finally{
           lock.unlock();//解锁
           //如果同步代码有异常,要将unlock写入finally语句块
      }
  }
}

 

package Runnable1;

import java.util.concurrent.locks.ReentrantLock;

//测试lock锁
//抢票
public class TestLock
{
   public static void main(String[] args) {
       TestLock2 testLock2=new TestLock2();
       new Thread(testLock2,"我").start();
       new Thread(testLock2,"你").start();
       new Thread(testLock2,"他").start();
  }
}
class TestLock2 implements Runnable
{
   int ticketNums=10;

   //定义lock锁
  private final ReentrantLock lock=new ReentrantLock();
   @Override
   public void run()
  {
      while (true)
      {

          try {
              lock.lock();//加锁
              if (ticketNums>0)
              {
                  try {
                      Thread.sleep(100);
                  } catch (InterruptedException e) {
                      throw new RuntimeException(e);
                  }
                  System.out.println( Thread.currentThread().getName()+"第"+ticketNums--+"票");
              }else
              {
                  break;
              }
          }finally
          {
              //解锁
              lock.unlock();
          }

      }
  }
}
posted @ 2022-07-29 09:59  zjw_rp  阅读(114)  评论(0编辑  收藏  举报