本文转载自java中synchronized与Lock的异同

前言

synchronized和Lock通过互斥保障原子性,能够保护共享数据以实现线程安全,其作用包括保障原子性、可见性、有序性

常见问题

在平时聊天或者面试过程中,可能会被问到,既然已经有了synchronized了,为什么JSR166小组花这么多时间来开发j.u.c的Lock框架呢,换句话说就是内部锁和显示锁之前有什么区别?

分析

synchronized(内部锁)

java平台中的任何一个对象都有唯一一个与之关联的锁,这种锁称为监视器(Monitor)或者内部锁(Intrinsic Lock),内部锁是通过synchronized关键字实现的,可以用来修饰方法(同步方法、静态方法)、代码块(临界区)

Lock(显示锁)

JDK1.5开始引入的排他锁,默认实现是ReetrantLock,作为一种线程同步机制,其拥有和synchronized相同的语义,并且还提供了一些synchronized不具备的特性

差异

从本质上来讲

synchronized是在JVM层面实现的,

ReetrantLock是java API层面实现的排它锁,系统无法自动释放锁,需要在代码中的finally子句中显示释放,否则会出现锁泄漏

从安全上来讲

内部锁在退出临界出时,会自动释放锁,不会导致锁泄漏

外部锁如果未主动释放锁或者释放代码在finally子句中,容易导致锁泄漏

从使用上来讲

synchronized可以修饰方法,修饰代码块,但是内部锁的申请与释放只能在一个方法内进行,因为代码无法跨方法

Lock,只能修饰代码块,但是它可以发挥面向对象编程的灵活性,显示锁的申请在一个方法,在另一个方法里释放锁

在锁的调度方面

内部锁公平锁,显示锁即支持非公平也支持公平锁

在问题定位方面

线程转储可能无法包含显示锁的相关信息,从而导致问题定位困难。比如果在JDK1.5下线程转储中会包含内部锁的相关信息,不包含显示锁的信息

从性能方面方面

等待同一把内部锁的线程,都在同一个等待队列中,等待系统调度,而ReentrantLock锁,可以通过Condition条件变量,实现分组等待的效果,所以性能表现上更好一些

从其它特性方面

当一个线程在等待获取一个锁时,因为线程活性故障导致其永远无法获取得锁时,使用内部锁的线程会一直傻傻的等待一个无法获得的锁,换句话说,内部锁缺少可中断的特性,

显示锁它拥有与内部锁相同的并发性和内存主义,但是添加了轮询锁定时锁等候可中断锁等候一些新特性,使其在激烈争用情况下表现出更好的性能,因为当多线程访问共享资源时,JVM可以将更多的时间用于执行线程上,而不是浪费时间在线程调度上。

  • 轮询锁意味着,ReentrantLock支持公平锁,可以通过轮询的方式依次获取锁
  • 定时锁等候意味着,线程在N长时间之内无法获取到锁,就会返回false ,表示获取锁失败,tryLock方法,不会像内部锁一样痴痴的等待一个没有结果的未来
  • 可中断锁等待,意味着ReentrantLock提供了一种能够中断等待锁的线程的机制,通过lock.lockInterruptibly()来实现这个机制。

如何选择

如果你使用的是JDK1.5的话,在争用不高的时候可以使用内部锁,在争用高的情况下,建议使用显示锁

如果你使用的是JDK1.5+的版本,随着对内部锁的优化(锁消除、锁粗化、偏向锁、自适应锁),两都之间的性能差异已经缩小了很多,如果后期内部锁的这些优化可以应用到显示锁的话,那性能可能就会有很大差距了。

总体上来说,在资源竞争不激烈的情形下,性能稍微比synchronized差点点。但是资源竞争非常激烈的时候,synchronized的性能会下降很多,而ReentrantLock的性能表现仍然比较稳定。

结束语

在工作中,为了保证线程安全我们不一定要使用锁,可以使用一些轻量级的同步工具或者无锁的框架和工具,来提升应用的性能。

java中synchronized与Lock的异同的更多相关文章

  1. JAVA中synchronized和lock详解

         目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea.本文并不比较synchronize ...

  2. Java中Synchronized和Lock的使用

    Lock的锁定是通过代码实现的,而 synchronized 是在 JVM 层面上实现的 synchronized在锁定时如果方法块抛出异常,JVM 会自动将锁释放掉,不会因为出了异常没有释放锁造成线 ...

  3. Java中synchronized和Lock的区别

    synchronized和Lock的区别synchronize锁对象可以是任意对象,由于监视器方法必须要拥有锁对象那么任意对象都可以调用的方法所以将其抽取到Object类中去定义监视器方法这样锁对象和 ...

  4. Java并发指南4:Java中的锁 Lock和synchronized

    Java中的锁机制及Lock类 锁的释放-获取建立的happens before 关系 锁是java并发编程中最重要的同步机制.锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消 ...

  5. java中synchronized的用法详解

    记下来,很重要. Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchron ...

  6. java中synchronized的使用方法与具体解释

    Java语言的keyword.当它用来修饰一个方法或者一个代码块的时候,可以保证在同一时刻最多仅仅有一个线程运行该段代码. 一.当两个并发线程訪问同一个对象object中的这个synchronized ...

  7. Java 中 synchronized的用法详解(四种用法)

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码.本文给大家介绍java中 synchronized的用法,对本文感兴趣的朋友一起看看吧 ...

  8. java中 synchronized 的使用,确保异步执行某一段代码。

    最近看了个有关访问网络url和下载的例子,里面有几个synchronized的地方,系统学习下,以下内容很重要,记下来. Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一 ...

  9. JAVA 中 synchronized 详解

    看到一篇关于JAVA中synchronized的用法的详解,觉得不错遂转载之..... 原文地址: http://www.cnblogs.com/GnagWang/archive/2011/02/27 ...

随机推荐

  1. CSS中一些重要概念

    在CSS的最后一个博客中,将学习整理一些CSS中的重要概念,对这些重要概念的掌握,将对CSS的认识十分重要. 了解这些概念对深入理解CSS的本质十分重要:(1)包含块containing block ...

  2. Spark Dataset DataFrame 操作

    Spark Dataset DataFrame 操作 相关博文参考 sparksql中dataframe的用法 一.Spark2 Dataset DataFrame空值null,NaN判断和处理 1. ...

  3. 省市县sql

    create table SYS_AREA ( ID NUMBER(18) not null, AREA_CODE VARCHAR2(50) not null, AREA_NAME VARCHAR2( ...

  4. php之PDO连接mysql数据库,增删改查等等操作实例

    我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严就有SQL注入风险,导致网站被攻击. 虽然可以用mysql_real_escape_string ...

  5. nginx教程<一>

    2020最新Nginx教程全面讲解教程,感觉讲的很不错但是需要有docker基础,因为是基于docker快速搭建的nginx. 1.为什么要学习Nginx 肯定是工作和业务需求催生的学习需要哈哈,不过 ...

  6. 设计模式(十二)——享元模式(Integer缓冲池源码分析)

    1 展示网站项目需求 小型的外包项目,给客户 A 做一个产品展示网站,客户 A 的朋友感觉效果不错,也希望做这样的产品展示网站,但是要求都有些不同: 1) 有客户要求以新闻的形式发布 2) 有客户人要 ...

  7. PIE模型

    首先,我们需要明确程序的Bug有如下的定义: 1. Fault/Defect 静态的,存在于软件中的缺陷.例如:一段有缺失或者错误的代码. 2. Error 运行时一种不正确的中间状态. 3. Fai ...

  8. FunnyXEN

    For any positive integer n, we define function F(n) and XEN(n).For a collection S(n)={1,2,...,2n}, w ...

  9. AtCoder Beginner Contest 164

    比赛链接:https://atcoder.jp/contests/abc164 A - Sheep and Wolves #include <bits/stdc++.h> using na ...

  10. Codeforces Round #647 (Div. 2) - Thanks, Algo Muse! C. Johnny and Another Rating Drop (规律,二进制)

    题意:有一个正整数\(n\),要求写出所有\(1\)~\(n\)的二进制数,统计相邻的两个二进制同位置上不同数的个数. 题解:打表找规律,不难发现: ​ \(00000\) ​ \(00001\) ​ ...