美文网首页
关于Lock与synchronized关键字在锁的处理上的重要差

关于Lock与synchronized关键字在锁的处理上的重要差

作者: 龙剑灵 | 来源:发表于2020-05-08 16:35 被阅读0次

    关于Lock与synchronized关键字在锁的处理上的重要差别

    • 1.锁的获取方式:前者是通过程序代码的方式由开发者手工获取,后者是通过JVM来获取(无需开发者干预)
    • 2.具体实现方式:前者是通过Java代码的方式来实现,后者是通过JVM底层来实现_ (无需开发者关注)
    • 3.锁的释放方式:前者务必通过unlock()方法在finally块中手工释放,后者是通过JVM来释放(无需开发者关注)
    • 4.锁的具体类型:前者提供了多种,如公平锁、非公平锁,后者与前者均提供了可重入锁
    1. 传统上,我们可以通过synchronized关键字 + wait + notify/notifyAll 来实现多个线程之间的协调与通信,整个过程都是由JVM来帮助我们实现的;开发者无需(也是无法)了 解底层的实现细节

    2. 从JDK 5开始,并发包提供了Lock, Condition(await与signal/signalA11 )来实现多个线程之间的协调与通信,整个过程都是由开发者来 控制的,而且相比于传统方式,更加灵活,功能也更加强大

    3.Thread. sleep与await. (或是Object的wait方法) 的本质区别: sleep方法本质.上不会释放锁,而await会释放锁, 并且在signal后,还需要重新获得锁才能继续执行(该行为与object的wait方法完全一致)

    public class MyTest2 {
    
      public static void main(String[] args) {
    
        BoundedContainer bc = new BoundedContainer();
    
        IntStream.range(0, 10).forEach(i -> new Thread(() -> {
          try {
            bc.take();
          } catch (Exception e) {
    
          }
        }).start());
    
        IntStream.range(0, 10).forEach(i -> new Thread(() -> {
          try {
            bc.put("hello");
          } catch (Exception e) {
    
          }
        }).start());
    
      }
    }
    
    class  BoundedContainer {
    
      private String[] elements = new String[10];
    
      private Lock lock = new ReentrantLock();
    
      private Condition notEmptyCondition = lock.newCondition();
    
      private Condition notFullCondition = lock.newCondition();
    
      private int elementCount; //已有的元素数量
    
      private int putIndex;
    
      private int takeIndex;
    
    
      public void put(String ele) throws InterruptedException {
        this.lock.lock();
        try {
          //如果所有位置已放满
          while (elementCount == elements.length) {
            notFullCondition.await();
          }
    
          this.elements[putIndex] = ele;
          if (++putIndex == elements.length) {
            putIndex = 0;
          }
          elementCount++;
          System.out.println("put: " + Arrays.toString(elements));
          notEmptyCondition.signal();
        } finally {
          this.lock.unlock();
        }
      }
    
      public void take() throws InterruptedException {
        this.lock.lock();
        try {
          while (elementCount == 0) {
            notEmptyCondition.await();
          }
    
          this.elements[takeIndex] = null;
          elementCount--;
    
          if (++takeIndex == elements.length) {
            takeIndex = 0;
          }
          System.out.println("take: " + Arrays.toString(elements));
          notFullCondition.signal();
        } finally {
          this.lock.unlock();
        }
      }
    
    
    }
    
    

    相关文章

      网友评论

          本文标题:关于Lock与synchronized关键字在锁的处理上的重要差

          本文链接:https://www.haomeiwen.com/subject/rzhdghtx.html