Lock 接口与 synchronized 关键字的区别

2023-11-11

 

      

拷贝别的博主总结的9点不同:

1.JDK版本不同

synchronized关键字产生于JKD1.5之前,是低版本保证共享资源同步访问的主要技术。
Lock接口产生于JDK1.5版本,位于著名的java.util.concurrent并发包中,是Java提供的一种比synchronized关键字更加灵活与丰富的共享资源同步访问技术。


2.读写锁

synchronized关键字只提供了一种锁,即独占锁。
Lock接口不仅提供了与前者类似的独占锁,而且还通过ReadWriteLock接口提供了读锁和写锁。
读写锁最大的优势在于读锁与读锁并不独占,提高了共享资源的使用效率。


3.块锁与链锁

synchronized关键字以代码块或者说是作用域机制实现了加锁与解锁,我简称为块锁。synchronized关键字的作用域机制导致同步块必须包含在同一方法中,且多个锁的加锁与解锁顺序正好相反,即:{{{}}}结构。
Lock接口并不限制锁的作用域和加解锁次序,可以提供类似于链表样式的锁,所以我简称为链锁。Lock接口并不需要把加锁和解锁方法放在同一方法中,且加锁和解锁顺序完全随意,即:{{}{}}结构。


4.解锁方式

synchronized关键字:随着同步块/方法执行完毕,自动解锁。
Lock接口:需要手动通过lock.unlock()方法解锁,一般此操作位于finally{}中。


5.阻塞锁与非阻塞锁

synchronized关键字提供的锁是阻塞的,它会一直尝试通过轮询去获取对象的监视锁。
Lock接口通过lock.tryLock()方法提供了一种非阻塞的锁,它会尝试去获取锁,如果没有获取锁,则不再尝试。


6.可中断锁

synchronized关键字提供的锁是不可中断的,它会一直尝试去获取锁,我们无法手动的中断它。
Lock接口通过lock.lockInterruptibly()提供了一种可中断的锁,我们可以主动的去中断这个锁,避免死锁的发生。


7.可超时锁

synchronized关键字提供的锁是不可超时的,它会一直尝试去获取锁,直至获取锁。
Lock接口通过{tryLock(long, TimeUnit)方法}方法提供了一种可超时的锁,它会在一段时间内尝试去获取锁,如果限定时间超时,则不再尝试去获取锁,避免死锁的发生。


8.公平锁(线程次序保证)

我们都知道,如果高并发环境下多个线程尝试去访问同一共享资源,同一时刻只有一个线程拥有访问这个共享资源的锁,其他的线程都在等待。

synchronized关键字提供的锁是非公平锁,如果持有锁的线程释放了锁,则新进入的线程与早就等待的线程拥有同样的机会获取这个锁,简单来说就是不讲究:先来后到,反而讲究:来得早不如来得巧。非公平锁可能导致某些线程永远都不会获取锁。
Lock接口默认也是非公平锁,但是他还可以通过fair参数指定为公平锁。在公平锁机制下,等待的线程都会被标记等待次数,等待次数越多的锁获取锁的优先级越高,也就是常说的:先到先得。


9.互不干扰、可以共用

synchronized关键字是通过关键字实现对对象的加锁与解锁的。
Lock接口是通过Lock接口的实现类的实例对象的lock()和unlock()方法实现加锁与解锁的。
我们也可以通过synchronized关键字对Lock接口的实现类的实例对象进行监视器锁的加锁与解锁。而且对监视器锁的加锁与解锁与Lock接口的实现类的实例对象的lock()和unlock()方法并不冲突。
也就是说我们可以同时使用Lock接口和synchronized关键字实现同步访问控制。
但是,原则上是极其不建议这种混搭的同步访问控制方式的,不仅代码难以阅读,而且容易出错。
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lock 接口与 synchronized 关键字的区别 的相关文章

  • 什么是Java中的公平锁?

    一直想分析下公平锁和非公平锁在Java中的实现 公平锁 Fair 加锁前检查是否有排队等待的线程 优先排队等待的线程 先来先得非公平锁 Nonfair 加锁时不考虑排队等待问题 直接尝试获取锁 获取不到自动到队尾等待 首先Java中的Ree
  • Lock 接口与 synchronized 关键字的区别

    拷贝别的博主总结的9点不同 1 JDK版本不同 synchronized关键字产生于JKD1 5之前 是低版本保证共享资源同步访问的主要技术 Lock接口产生于JDK1 5版本 位于著名的java util concurrent并发包中 是
  • Java多线程编程基础篇(二)-多线程同步关键字

    一 多线程同步关键字 synchronized 1 概念 synchronized保证方法或者代码块在运行时 同一时刻只有一个方法可以进入到临界区 同时它还可以保证共享变量的内存可见性 当多个并发线程访问同一个对象object中的同步代码块
  • lock-linux

    sem unlink sem open pthread getspecific
  • 同步,何时使用或不使用?

    我开始学习Java中的并发和线程 我了解同步的基础知识 即它的作用 从概念上讲 我理解它提供了对 Java 中多个线程共享资源的互斥访问 但是 当面对像下面这样的示例时 我很困惑同步它是否是一个好主意 我知道代码的关键部分应该同步 并且这个
  • 同步单例的正确使用?

    所以我正在考虑建立一个业余爱好项目 这是一种临时性的事情 只是为了温习我的编程 设计 它基本上是一个多线程网络蜘蛛 更新相同的数据结构object gt int 因此 为此使用数据库绝对是大材小用 我唯一能想到的是用于包含我的数据结构的线程
  • 在 Java 临界区中,我应该同步什么?

    在 Java 中 在代码中声明临界区的惯用方法如下 private void doSomething thread safe code synchronized this thread unsafe code thread safe cod
  • Java:如何检查是否可以获得锁? [复制]

    这个问题在这里已经有答案了 如果我想确保对 Java 中的对象进行独占访问 我可以这样写 Zoo zoo findZoo synchronized zoo zoo feedAllTheAnimals 有没有办法检查对象当前是否被锁定 如果另
  • 使用“notify()”和“wait()”代替“suspend()”和“resume()”来控制线程

    我正在尝试学习如何在java中暂停和恢复线程 我正在使用一个Applet that implements Runnable有2个按钮 开始 和 停止 public void init th new Thread this th start
  • 在函数中通过类名同步是否在扩展类中有效?

    我在基类中有一个方法 foo 使用 Synchronized 类名 以及扩展基类的两个类 A 和 B 如果我在两个不同的线程中从 A 实例和 B 实例调用 foo 它们会同步吗 这是一个示例代码 class BaseClass void f
  • 我应该使用同步方法来改变该字段吗?

    随着接下来的课程 This class should be thread safe class BankAccount private long balance Should it be volatile synchronized void
  • 为什么同步字段变量并在同步块内递增它会导致打印乱序?

    我有一个简单的代码片段 public class ItemManager private Integer itemCount 0 public void incrementAndPrint synchronized this System
  • java 中的 Thread.sleep() 与同步

    当 Thread sleep 10000 被调用时 当前线程将进入睡眠状态 如果在同步方法中调用Thread sleep 10000 那么在此期间其他线程是否可以执行 如果你这样做Thread sleep 10000 在同步方法中或阻止您d
  • 如何检查对象是否正在@synchronized

    有时我会编写以下代码来同步例程 synchronized objToBeSync 当两个线程尝试同时访问同步块时 其中一个线程会阻塞其他线程 直到其中一个线程退出同步块 但是 有时我不希望一个对象阻塞另一个对象 但其他对象检查对象是否正在同
  • java 中的同步 - 正确使用

    我正在构建一个在多进程 线程 中使用的简单程序 我的问题更容易理解 什么时候我必须使用保留字同步 我是否需要在影响骨骼变量的任何方法中使用这个词 我知道我可以将它放在任何非静态的方法上 但我想了解更多 谢谢你 这是代码 public cla
  • 易失性数组的替代方案

    从其他问题中 我了解到易失性数组的元素不是易失性的 只有引用本身是不稳定的 volatile int data Thread A data 4 457 Thread B System out println data 4 在这里 线程 B
  • 并发代码分析器

    我想知道是否有任何框架或应用程序 app 程序可以分析任何java代码的并发性 如果该工具知道 jre 提供的类和方法的所有实现 那么它就可以归结为对同步块和方法及其调用层次结构的简单分析 从这里它可以创建一个 Petri 网并确定地告诉您
  • 学习Java,synchronized关键字的使用

    所以我正在测试synchronized关键词 这是我尝试过的一个例子 public class MyTest static int i 0 public static void main String args new Thread t1
  • BluetoothChat同步了Activity的onResume生命周期方法,为什么?

    我现在正在研究蓝牙 Android API 并且遇到了 BluetoothChat 示例 http developer android com resources samples BluetoothChat index html http
  • java 数组列表上的易失性/同步

    我的程序如下所示 public class Main private static ArrayList

随机推荐