首页 > 其他分享 >Synchronized和Lock的区别

Synchronized和Lock的区别

时间:2023-05-28 20:33:17浏览次数:22  
标签:加锁 Synchronized synchronized 区别 队列 Lock 等待 标注

synchronized与Lock的主要区别如下:

一、 synchronized是Java的内置关键字,而Lock是接口,其常用实现类为ReentrantLock(可重入锁)和ReentrantReadWriteLock(读写锁);

二、 synchronized是隐式的加锁,这个流程自动化,而Lock是显式的加锁,需要手动的lock()和unlock();

三、 synchronized常作用于代码块或方法上,而Lock只能作用于方法块;

四、 synchronized底层在方法上使用了 ACC_SYNCHRONIZED 来加锁,在代码块上使用了monitorenter(标注开始)和monitorexit(标注结束)指令来标注同步代码块,而Lock采用的AQS;

五、 synchronized是阻塞式加锁,Lock 是非阻塞式加锁支持可中断式加锁,支持超时时间的加锁;

六、 synchronized在进行加锁解锁时,只有一个同步队列和一个等待队列,Lock有一个同步队列,可以有多个等待队列;

七、 synchronized只支持非公平锁,Lock 支持非公平锁和公平锁;

八、 synchronized使用了 object 类的 wait 和 notify 进行等待和唤醒,Lock 使用了 condition 接口进行等待和唤醒(await和signal);

标签:加锁,Synchronized,synchronized,区别,队列,Lock,等待,标注
From: https://www.cnblogs.com/fxy0715/p/17438692.html

相关文章

  • Debug和release的介绍以及二者的区别
    一、介绍Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。在Debug环境下,我们可以使用调试技巧,如观察监视、内存、反汇编等等。Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。所以,Debug环境......
  • git 查看文件修改前和修改后的区别:005
    命令:girdiffgirdiff--staged 1.查看某个文件修改了哪些内容,后者是查看所有文件都修改了哪些内容(注意:这是查看未追踪的文件的)gitdiff文件名gitdifff 2.查看(已追踪但未提交)的文件修改差异gitdiff--staged ......
  • synchronized一个有趣现象
    在学习synchronized时发现了一个有趣的现象:publicclassMyThreadimplementsRunnable{privateintnumber=10;privatebooleanflag=true;@Overridepublicvoidrun(){while(flag){//同步块,()填变化的量必须是引用类型,锁定的......
  • hashmap怎么解决哈希冲突问题?红黑树和AVL树有何区别?
    链地址法hashmap是一种基于数组和链表(或红黑树)的数据结构,它可以通过hash函数将任意长度的键映射到一个固定长度的索引,从而实现快速的存取操作。但是,由于hash函数的结果是有限的,而键的数量是无限的,所以可能存在不同的键映射到同一个索引的情况,这就叫做哈希冲突。为了解决哈希冲突,has......
  • JS 中 for in 和 for of 的区别
    记忆方法:forin:ES5先出,index,遍历索引,适合对象forof:ES6后出,遍历属性,适合数组 forin和forof 是js中常用的遍历方法;两者的区别如下:一,遍历数组1,forin 是ES5的语法标准,而forof则是ES6语法标准。constarr1=['Eula','Umbra','Kaya']for(letiinarr1){......
  • wait()和sleep()的区别
    (1)wait()方法是object类的方法,sleep是Thread类的静态方法。(2)wait()方法需要和锁搭配使用,线程调用wait()方法会释放锁,而sleep()方法不需要和锁搭配使用,线程调用sleep()方法不会释放锁。(3)线程调用wait()方法需要其它线程调用notify()或者notifyAll()方法唤醒线程,而线程调用sleep()方法到了一定时间会......
  • java中throw和throws的区别
    在Java中,throw和throws是两个关键字,用于处理异常。throw用于在程序中手动抛出一个异常。它用于指示程序中的某个错误状态,并将异常抛回到相应的调用栈。例如:if(user==null){thrownewIllegalArgumentException("Usercannotbenull.");}在上述代码中,如果用户为空,则手动......
  • 成员变量和局部变量的区别
    packagecom.variable;publicclassTest{//成员变量和局部变量的区别//1.类中的位置不同:成员变量(类中,方法外)、局部变量(常见于方法中)//2.初始化值不同:成员变量(有默认值,不需要初始化赋值)、局部变量(没有默认值,使用之前必须完成赋值)//3.内存位置不同:成员变量(存在于堆内存)、局......
  • Wimlib-imagex 1.14.1和ImageX Tool for Windows Version: 10.0.10011.16384是两款不
    Wimlib-imagex1.14.1和ImageXToolforWindowsVersion:10.0.10011.16384是两款不同的Windows镜像工具,它们之间存在一些区别。开发者不同:Wimlib-imagex是由OpenSourceCommunity开发的自由开源软件,而ImageXToolforWindows是Microsoft开发的商业软件。编写语言不同:Wi......
  • linux的locate命令和find命令的区别
    一:locate命令 locate命令用于查找文件,它比find命令的搜索速度快,它需要一个数据库,这个数据库由每天的例行工作(crontab)程序来建立。当我们建立好这个数据库后,就可以方便地来搜寻所需文件了。 即先运行:updatedb(无论在那个目录中均可,可以放在crontab中)后在  /var/lib/sloc......