Lock与Synchronized的区别

51 阅读1分钟

什么是锁?

锁就是控制堆共享资源的访问机制,它用于在多线程中防止多个线程或进程同时访问共享资源,导致数据的不一致性。

  1. Synchronized 锁是自动的,而Lock锁是手动创建删除的。
  2. Synchronized 锁内置的Java关键字,而Lock锁是一个类。
  3. Synchronized 锁 是可重入锁,不可中断线程,非公平锁;Lock锁 是可重入锁、可选中断线程,可设置锁是否公平。
  4. Synchronized 会自动释放线程,而Lock则需要手动释放,如果不设防线程--死锁
  5. Synchronized 锁中 线程1(获得锁,然后阻塞)线程2(一直等待);Lock锁不一定会等待下去
  6. Synchronized 锁适合少量的代码同步问题; Lock锁适合大量的同步代码;

Lock是Java.util.concurrent下的

Lock锁为什么可设置锁是否公平

    public ReentrantLock() {
        sync = new NonfairSync();
    }

    /**
     * Creates an instance of {@code ReentrantLock} with the
     * given fairness policy.
     *
     * @param fair {@code true} if this lock should use a fair ordering policy
     */
    public ReentrantLock(boolean fair) {
        sync = fair ? new FairSync() : new NonfairSync();
    }

Lock锁为什么可以选择线程中断?

通过lockInterruptibly()方法,在程序抛出异常后终端程序。

  public void sale() {
      try {
          lock.lockInterruptibly(); // 替换为可中断的加锁方式
          try {
              if (count > 0) {
                  System.out.println(Thread.currentThread().getName() + ": 卖出第" + (50 - count + 1) + "张票,剩余:" + (--count));
              }
          } finally {
              lock.unlock();
          }
      } catch (InterruptedException e) {
          // 处理中断异常
          System.out.println(Thread.currentThread().getName() + " 被中断");
          Thread.currentThread().interrupt(); // 保留中断状态
      }
  }