zoukankan      html  css  js  c++  java
  • Java多线程之Lock(锁)

    Java多线程之Lock(锁)

    定义:

    在Java多线程中,可以使用synchronized关键字实现线程之间的同步,在JDK5后新增的ReentrantLock类同样可达到此效果,且在使用上比synchronized更加灵活。

    特征:

    • 从JDK5开始,Java提供了更强大的线程同步机制——通过显式定义同步锁对象来实现同步;

    • 同步锁使用Lock对象来充当;

    • import java.util.concurrent.locks.Lock
    • 以上接口时控制多个线程对共享资源进行访问的工具;

    • 锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应先获得Lock对象;

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

    synchronized与Lock的对比:

    • Lock是显式锁(手动开启和手动关闭锁);

    • synchronized是隐式锁,出了作用域后自动释放;

    • Lock只有代码块锁;

    • synchronized有代码块锁和方法锁;

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

    • 优先使用顺序:

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

    示例:

    package 线程同步;
    import java.util.concurrent.locks.ReentrantLock;

    //lock锁
    public class TestLock2 {
       public static void main(String[] args) {
           lock lock = new lock();

           new Thread(lock,"A").start();
           new Thread(lock,"B").start();
           new Thread(lock,"C").start();
      }
    }
    class lock implements Runnable{
       int num=10;

       ReentrantLock ll=new ReentrantLock();

       @Override
       public void run() {
           while (true){
               try {
                   ll.lock();      //加锁
                   if (num>0){
                       try {
                           Thread.sleep(1000);
                      } catch (InterruptedException e) {
                           e.printStackTrace();
                      }
                       System.out.println(Thread.currentThread().getName()+"得到了第"+num--);
                  }else
                       break;
              }
               finally {
                   ll.unlock();    //解锁
              }
          }
      }
    }

    备注:lock()方法和unlock()方法需要放在try-catch-finally中。

  • 相关阅读:
    计算机基础--http的基础整理和巩固
    设计方案系列-如何看待前端框架选型 ?
    数据可视化-svg入门基础(二)
    数据可视化系列--svg入门基础(一)
    Jenkins自动部署增加http状态码校验
    快速搭建python程序
    Request 接收参数乱码原理解析三:实例分析
    Request 接收参数乱码原理解析二:浏览器端编码原理
    Request 接收参数乱码原理解析一:服务器端解码原理
    Newtonsoft.Json(Json.Net)学习笔记
  • 原文地址:https://www.cnblogs.com/awong18/p/13159996.html
Copyright © 2011-2022 走看看