文章目录

  • 1、具体区别(核心)
  • 2、在锁概念上的区别
  • 3、性能比较

1、具体区别(核心)

(1)synchronized和Lock都是可重入锁,前者是jvm中使用monitorenter(1个)和monitorexit(2个)来
实现同步且其中阻塞和唤醒是wait和notify,后者是juc包中的lock层次使用,依赖于AQS来实现加锁和解锁;
(2)synchronized是非公平锁,ReentrantLock可以设置公平锁或者非公平锁;
(3)synchronized是不可中断且无法获取锁状态,后者是可中断lockInterruptibly方法,同时也可获取锁的状态isLocked();
(4)synchronized是不能精准唤醒的,ReentrantLock是可以依赖于Condition对象设置条件进行精准唤醒;
(5)synchronized是jdk提供的关键字,Lock是普通的java类(接口),前者可锁方法或代码块,后者只能锁代码块;
(6)synchronized是不会产生死锁,lock使用lock()方法和unlock()方法成对使用,否则产生死锁;

2、在锁概念上的区别

(1)可中断锁
响应中断的锁,Lock是可中断锁(体现在lockInterruptibly()方法),synchronized不是。如果线程A正在执行锁中代码,
线程B正在等待获取该锁。时间太长,线程B不想等了,可以让它中断自己。
(2)公平锁
尽量以请求锁的顺序获取锁。比如同时有多个线程在等待一个锁,当锁被释放后,等待时间最长的获取该锁,跟京牌司法拍卖一个道理。
非公平锁可能会导致有些线程永远得不到锁,synchronized是非公平锁,ReentrantLock是公平锁。
(3)读写锁
读写锁将对一个资源(如文件)的访问分为2个锁,一个读锁,一个写锁;读写锁使得多个线程的读操作可以并发进行,不需同步。
而写操作就得需要同步,提高了效率ReadWriteLock就是读写锁,是一个接口,ReentrantReadWriteLock实现了这个接口。
可通过readLock()获取读锁,writeLock()获取写锁
(4)绑定多个条件
一个ReentrantLock可以绑定多个Condition对象,仅需多次调用new Condition()即可;而在synchronized中锁锁对象的wait()、
notify()/notifyAll()可以实现一个隐含的条件,如果要和多余的条件关联,就不得不额外的增加一个锁。

3、性能比较

大量线程同时竞争,ReentrantLock要远胜于synchronized。
(1)JDK5中,synchronized是性能低效的,因为这是一个重量级操作,对性能的最大影响是阻塞的实现,挂起线程和恢复线程的操作,
都需要转入内核态中完成,给并发带来了很大压力。
(2)JDK6中synchronized加入了自适应自旋、锁消除、锁粗化、轻量级锁、偏向锁等一系列优化,官方也支持synchronized,
提倡在synchronized能实现需求的前提下,优先考虑synchronized来进行同步。

Synchronized与Lock区别相关推荐

  1. Synchronized 和 Lock 区别

    Synchronized 和 Lock 区别 Synchronized 是内置的Java关键字, Lock 是一个Java类 Synchronized 无法判断获取锁的状态,Lock 可以判断是否获取 ...

  2. synchronized 和Lock区别

    synchronized实现原理 Java中每一个对象都可以作为锁,这是synchronized实现同步的基础: 普通同步方法,锁是当前实例对象 静态同步方法,锁是当前类的class对象 同步方法块, ...

  3. Java多线程学习十三:synchronized 和 Lock 区别以及孰优孰劣,如何选择?

    synchronized 和 Lock 的异同点,以及该如何选择. 相同点 synchronized 和 Lock 的相同点非常多,我们这里重点讲解 3 个比较大的相同点 ABC. A:synchro ...

  4. 密码锁 java接口_从synchronized和lock区别入手聊聊java锁机制

    写这篇文章之前,我去百度了一下啥叫锁,百度百科上写道:置于可启闭的器物上,以钥匙或暗码开启.确实我们一般理解的锁就是门锁,密码锁,但是在计算机科学中,锁又是啥,说实话,这个问题我也思考了很久,也没法很 ...

  5. Synchronized和Lock区别

  6. synchronized与Lock的区别与使用

    原文链接 https://blog.csdn.net/u012403290/article/details/64910926 ###引言: 昨天在学习别人分享的面试经验时,看到Lock的使用.想起自己 ...

  7. Synchronized和Lock有什么区别

    前言 早期的时候我们对线程的主要操作为: synchronized wait notify 然后后面出现了替代方案 lock await singal 问题 synchronized 和 lock 有 ...

  8. 题目:三个售票员 卖出 30张票 || 多线程编程的企业级套路+模板||synchronized与Lock的区别

    package com.dym.juc;//资源类 class Ticket {private int number =30;public synchronized void saleTicket() ...

  9. Java多线程之Synchronized和Lock的区别

    Java多线程之Synchronized和Lock的区别 目录: 原始构成 使用方法 等待是否可以中断 加锁是否公平 锁绑定多个条件Condition 小结:Lock相比较Synchronized的优 ...

最新文章

  1. 2016中国知识管理发展的7个趋势
  2. vue的route懒加载
  3. 如何配置android的adb环境变量,如何配置adb环境变量?win7配置adb环境变量的方法...
  4. 浅谈oracle中for update 和 for update nowait 和 for update wait x的区别
  5. Web开发中实用小工具
  6. python 干什么工作具有明显优势-python能做什么?有哪些优点?
  7. python | 关键词快速匹配检索小工具 pyahocorasick / ahocorapy
  8. Android 谷歌巨头,国际巨头强势助攻,谷歌新系统开始提速,华为的对手不止一个...
  9. linux管理员权限下执行popen,执行shell命令的函数——system()、popen()
  10. Linux vim常用命令
  11. wps分析工具库如何加载_量化分析|TALib超好用的技术库,再给它封装一层如何!...
  12. CuteFTP,8uftp cuteftp
  13. NET 常见网络命令
  14. MySQL第一节课总结
  15. 墨画子卿第一章第1节
  16. 软件版本 —— Alpha、Beta、RC版本的区别
  17. 雷迪9000使用说明_雷迪司UPS监控软件使用说明
  18. JAVA中的“人妖”
  19. 如何查看mysql警告信息_查看MySQL的警告信息
  20. 哈工大 计算机系统 大作业 2021春

热门文章

  1. 【C++零碎】条件操作符(表达式)—问号(?)
  2. fft谱分析中的栅栏效应和频谱泄露
  3. python+django+sae
  4. 最长公共子序列nlogn求法
  5. echart横坐标太长导致坐标显示不完全(三种方法)
  6. java可以做cs架构吗_cs架构能用云服务器么(常用cs架构应用)
  7. 通信小常识(手机上网使用几G网络)[手机信号G、E、O、3G、H、H+的什么意思]
  8. IOS开发之——UI界面调试工具Reveal(11)
  9. 用Python搞定九宫格式的朋友圈。内附“马云”朋友圈
  10. 一文详解synchronized