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中。

  • 相关阅读:
    JPEG图像压缩算法流程详解
    JPEG标准推荐的亮度、色度DC、AC Huffman编码表
    17软工- 第0次个人作业
    CNN炼丹瞎记录 mobilenet & se-resnet
    huggingface Bert的encode方法
    Failed to execute goal org.scala-tools:maven-scala-plugin:2.15.2:compile (compile) on project databus: wrap: org.apache.commons.exec.ExecuteException: Process exited with an error: 1(Exit value: 1)
    QT5实现消灭星星源码
    Hibernate介绍与简单使用示例代码
    Redis数据库介绍
    Failed to convert property value of type 'java.util.LinkedHashMap' to required type 'com.sun.javafx.collections.MappingChange$Map' for property
  • 原文地址:https://www.cnblogs.com/awong18/p/13159996.html
Copyright © 2011-2022 走看看