Java基础学习:多线程23(Lock锁 )

Java基础学习:多线程23

  • Lock锁:

    • 从JDK5.0开始,Java提供了更强大的线程同步机制:通过显式定义同步锁对象来实现同步;同步锁使用Lock对象充当;

    • java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的工具;锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应先获得Lock对象;

    • ReentrantLock类实现了Lock,它拥有与synchronized相同的并发性和内存语义,在实现线程安全的控制中,比较常用的是ReentrantLock,可以显式加锁,释放锁

       

  • synchronized:是隐式锁:锁了谁,不太好确定;

  • ReentrantLock:可重入锁

 

  • synchronized和Lock的对比:

    1. Lock是显式锁(手动开启和关闭锁,别忘了关闭锁);synchronized是隐式锁,处理作用域自动释放;

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

    3. 使用Lock锁,JVM将花费较少的时间来调度线程,性能更好。并且具有更好的扩展性(提供更多的子类)

    4. 优先使用:

      • Lock > 同步代码块(已经进入了方法体,分配了相应资源)> 同步方法(在方法体之外)

         

       

  • 代码案例:

    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){
               lock.lock();//加锁:加在票要变化的地方
               try {
                   if(ticketNums>0){
                       try {
                           Thread.sleep(1000);
                      } catch (InterruptedException e) {
                           e.printStackTrace();
                      }
                       System.out.println(ticketNums--);
                  }else{
                       break;
                  }
              }finally {//解锁
                   lock.unlock();
              }

          }
      }
    }
posted @   gzs1024  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示