`
zhaohaolin
  • 浏览: 1017808 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

synchronized和java.util.concurrent.locks.Lock的异同【转】

    博客分类:
  • JAVA
 
阅读更多

主要相同点:Lock能完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能,当许多线程都在争用同一个锁时,使用 ReentrantLock 的总体开支通常要比 synchronized 少得多。 synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。

 

ReentrantLock 保护代码块

 

我们什么时候才应该使用 ReentrantLock 呢?答案非常简单 —— 在确实需要一些 synchronized 所没有的特性的时候,比如时间锁等候、可中断锁等候、无块结构锁、多个条件变量或者锁投票。 ReentrantLock 还具有可伸缩性的好处,应当在高度争用的情况下使用它,但是请记住,大多数 synchronized 块几乎从来没有出现过争用,所以可以把高度争用放在一边。我建议用 synchronized 开发,直到确实证明 synchronized 不合适,而不要仅仅是假设如果使用 ReentrantLock “性能会更好”。请记住,这些是供高级用户使用的高级工具。(而且,真正的高级用户喜欢选择能够找到的最简单工具,直到他们认为简单的工具不适用为 止。)。一如既往,首先要把事情做好,然后再考虑是不是有必要做得更快

 

Resource4.java
package com.zj.lock;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Resource4 {
  private Lock lock1 = new ReentrantLock();
  private Lock lock2 = new ReentrantLock();
  private Lock lock3 = new ReentrantLock();
  public void f() {
    // other operations should not be locked...
    System.out.println(Thread.currentThread().getName()
       + ":not synchronized in f()");
    lock1.lock();
    try {
      for (int i = 0; i < 5; i++) {
       System.out.println(Thread.currentThread().getName()
           + ":synchronized in f()");
       try {
         TimeUnit.SECONDS.sleep(3);
       } catch (InterruptedException e) {
         e.printStackTrace();
       }
      }
    } finally {
      lock1.unlock();
    }
  }
  public void g() {
    // other operations should not be locked...
    System.out.println(Thread.currentThread().getName()
       + ":not synchronized in g()");
    lock2.lock();
    try {
      for (int i = 0; i < 5; i++) {
       System.out.println(Thread.currentThread().getName()
           + ":synchronized in g()");
       try {
         TimeUnit.SECONDS.sleep(3);
       } catch (InterruptedException e) {
         e.printStackTrace();
       }
      }
    } finally {
      lock2.unlock();
    }
  }
  public void h() {
    // other operations should not be locked...
    System.out.println(Thread.currentThread().getName()
       + ":not synchronized in h()");
    lock3.lock();
    try {
      for (int i = 0; i < 5; i++) {
       System.out.println(Thread.currentThread().getName()
           + ":synchronized in h()");
       try {
         TimeUnit.SECONDS.sleep(3);
       } catch (InterruptedException e) {
         e.printStackTrace();
       }
      }
    } finally {
      lock3.unlock();
    }
  }
  public static void main(String[] args) {
    final Resource4 rs = new Resource4();
    new Thread() {
      public void run() {
       rs.f();
      }
    }.start();
    new Thread() {
      public void run() {
       rs.g();
      }
    }.start();
    rs.h();
  }
}

分享到:
评论

相关推荐

    深入Synchronized和java.util.concurrent.locks.Lock的区别详解

    Synchronized和java.util.concurrent.locks.Lock都是Java中用于实现线程同步的关键字和接口,它们的主要目标是保证多线程环境下的数据一致性与并发安全。然而,两者在使用方式、控制粒度以及灵活性方面存在显著差异...

    多线程,高并发.pdf

    1. stop() 和 suspend() 方法为何不推荐使用? 2. sleep() 和 wait() 有什么区别? 3. 同步和异步有何异同,...5. 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同? 6. 概括的解释下线程的几种可用状态。

    整理的 神舟面试题 笔试题 有答案 要去神舟数码 软件公司面试的注意咯 再一版

    Java 语言的基本知识,包括逻辑操作、条件操作、interface 和 class 的继承、Java Server Page 和 Servlet 的联系和区别、XML 文档定义形式和解析方式、synchronized 和 java.util.concurrent.locks.Lock 的异同、...

    基于线程池的Java多线程应用技术.pdf

    Java提供了两种方式实现线程同步机制,分别是使用synchronized关键字和java.util.concurrent.locks.Lock接口。 线程池的应用: 线程池技术可以应用于Web服务系统中,控制服务器系统的最大并发数与最多处理的任务数...

    基于Java多线程同步的安全性研究.pdf

    文章首先介绍了Java多线程同步的必要性和重要性,然后讨论了Java多线程同步机制的实现方法,包括使用synchronized关键字和Java.util.concurrent.locks包中的Lock对象。接着,文章讨论了Java多线程同步机制中可能出现...

    工作在同一个java虚拟机中的线程能实现消息互发(alpha)

    6. **管程(Java 5后引入的`java.util.concurrent`包)**:如`java.util.concurrent.locks.Condition`和`java.util.concurrent.CountDownLatch`等,用于协调线程间的协作。 7. **ExecutorService和Future**:`java....

    SimpleDateFormat线程不安全的5种解决方案.docx

    import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class SimpleDateFormatExample { private static SimpleDateFormat simpleDateFormat = new ...

    java多线程实现生产者和消费者

    `java.util.concurrent.locks.Condition` 接口与 `java.util.concurrent.locks.Lock` 接口一起使用,提供了比`synchronized`更细粒度的控制。Lock提供了获取和释放锁的方法,而Condition则允许线程等待特定条件并被...

    Java多线程 - (一) 最简单的线程安全问题

    3. **Lock接口**:Java提供`java.util.concurrent.locks.Lock`接口,提供了比`synchronized`更细粒度的锁控制,如可重入锁、公平锁等。例如,`ReentrantLock`。 ```java import java.util.concurrent.locks.Lock; ...

    java多线程编程总结

    - `java.util.concurrent.locks.Lock`接口提供了比`synchronized`更灵活的锁定机制。 #### 六、Java多线程的高级特性 ##### 1. 线程池 - `java.util.concurrent.ExecutorService`接口提供了一种重用固定数量的线程...

    J.U.C系列线程安全的理论讲解编程开发技术共6页.pdf

    3. **`java.util.concurrent.locks`包**:包含锁和条件变量的实现,如`ReentrantLock`、`ReadWriteLock`等,它们提供了比`synchronized`更灵活的锁机制。 4. **`java.util.concurrent.atomic`和`java.util....

    [图文]Java标准类库-.doc

    `synchronized`关键字和`java.util.concurrent.locks`包中的锁机制是实现线程安全的关键。 6. **日期/时间API**:在Java 8之后,`java.time`包取代了传统的`java.util.Date`和`java.util.Calendar`,提供了更加友好...

    java Thread & synchronized & concurrent 线程、同步、并发

    为了解决这一问题,Java提供了更细粒度的锁,如`java.util.concurrent.locks.ReentrantLock`,它具有与`synchronized`相似的功能,但提供了更多的灵活性,如可中断的等待、定时等待和尝试获取锁。 此外,`java.util...

    java的concurrent用法详解

    `java.util.concurrent.locks`包中提供了比`synchronized`关键字更强大、更灵活的锁实现——`ReentrantLock`。 **2.2.1 `ReentrantLock`特性** - 支持公平锁和非公平锁的选择。 - 提供尝试获取锁的能力,可以指定...

    java5 thread

    - `java.util.concurrent.locks`:提供了更灵活的锁定机制,包括`Lock`和`Condition`接口,支持更复杂的线程同步需求。 ### 2. Callable和Future接口 `Callable`接口类似于`Runnable`,但可以返回一个结果,并且...

    concurrent-1.3.4-sources.jar

    4. **java.util.concurrent.locks** 包:这个包提供了高级锁机制,包括ReentrantLock、ReadWriteLock等。ReentrantLock可重入锁比内置的synchronized更灵活,提供了公平性和非公平性选择,以及尝试锁定、定时锁定...

    线程 临界点.rar案例

    import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Counter { private Lock lock = new ReentrantLock(); private int count = 0; public void ...

    2022年java初级工程师面试题.docx

    3. synchronized和java.util.concurrent.locks.Lock的异同:Lock能完成synchronized所实现的全部功能,但是Lock有比synchronized更精确的线程语义和更好的性能。 日期格式化 1. 使用Date对象来格式化日期。 2. ...

    java中的锁

    import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; Lock lock = new ReentrantLock(); lock.lock(); // 获取锁 try { // 临界区代码 } finally { lock.unlock(); // ...

    JavaLock与Condition的理解Reentran

    import java.util.concurrent.locks.ReentrantLock; public class ConditionExample { private final ReentrantLock lock = new ReentrantLock(); private final Condition condition = lock.newCondition(); ...

Global site tag (gtag.js) - Google Analytics