相信很多小伙伴们初学多线程的时候会被这两个名词搞晕,所以这里专门介绍这两种实现多线程锁的方式的区别和使用场景

Synchronized

这个关键词大家肯定都不陌生,具体的用法就是使用在对象、类、方法上

  • 当使用在对象和对象方法上的时候,就会获取相应的对象锁
public synchronized void method() {
    // do something
}
  • 当使用在类、类属性、类方法上的时候,就会获取相应的类对象锁
public class A {
    pubilc void method() {
        synchronized(A.class) {
            // do something
        }
    }
}

用法大概就是上面这两种了
使用synchronized方法的好处就是很简单,上锁解锁都是自动完成的,代码的可读性也是很好的
但是,万事都有利弊,synchronized的简单必然会导致他的灵活性会比较差
尤其是当我们想用到多个锁的时候,或者一个锁有多个条件的时候,这种方法都是难以实现的

所以下面我将介绍本文的主角,Lock对象

Lock

Lock本身是一个接口,有兴趣的小伙伴可以查看源码
在JDK中只有ReenterLock实现了Lock,而这个ReenterLock也就是我们常听到的重入锁
那么如何使用Lock呢,Lock又有哪些好处呢,下面一一道来
Lock的使用需要手动上锁解锁的

Lock lock = new ReenterLock();
lock.lock();
try {
    //do something
} catch(IntruptException e) {
    e.printStack();
} finally {
    lock.unlock();
}

看起来麻烦了很多,但是麻烦是有回报的
首先,我们可以很自由的获取和释放锁
其次,我们可以通过使用Condition来更加灵活地控制一个锁
不咕不咕,绝不咕咕咕

我们下面分别举例说明这两个好处

①可以自由获取和释放

给出下面一个场景

lock.lock();
if(/*condition*/) {
    lock.unlock();
}
else {
    // do someting
    lock.unlock();
}

这个例子举的不是很恰当,因为不太符合Lock的使用规范,但是表现出了这个优点,这种灵活性是synchronized不具备的

②可以通过Condition来更加灵活地控制一个锁

怎么个灵活呢,说白了就是可以有选择的睡眠和唤醒,下面给一个例子

背景是常见的生产者——消费者模型

我们希望当没有东西了消费者就等待,等待前唤醒生产者

东西满了生产者就等待,等待前唤醒消费者

要是用synchronized就不好实现这个逻辑,因为我们其实只有一个临界资源,只是不同的条件而已

但是用Lock就可以有效解决这个问题

Lock lock = new Lock();
Condition empty = lock.newCondition();
Condition full = lock.newCondition();

构造生产者和消费者的时候,将两个条件和锁传入

//Builder
lock.lock();
try {
    if(isEmpty()) {
        full.await();
    }
    // building...
    if(isFull()) {
        empty.await();
    }
}
// Consumer
lock.lock();
try {
    if(isFull()) {
        empty.signalAll();
    }
    // consuming
    if(isEmpty()) {
        full.await();
    }
}

这样,两个线程就可以通过两个Condition来通信,虽然两个线程都使用同一个锁,但是每次唤醒的时候都是有选择地唤醒。

如果有多个消费者和生产者,那么,这种方式可以保证消费者每次唤醒的都是生产者,生产者每次唤醒的都是消费者。


初次原创博客,思路不是很清晰,本人也在不断学习中,如有错误、纰漏,欢迎大神指出(orz

Syncrhonized 和 Lock的区别和使用的更多相关文章

  1. C#知识点总结系列:4、C#中Monitor和Lock以及区别

    Monitor对象 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取 ...

  2. C#中Monitor和Lock以及区别

    Monitor对象 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取 ...

  3. hibernate中load,get;find,iterator;merge,saveOrUpdate,lock的区别

    hibernate中load,get;find,iterator;merge,saveOrUpdate,lock的区别 转自http://www.blogjava.net/bnlovebn/archi ...

  4. Java中synchronized和Lock的区别

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

  5. Synchronize 和 Lock 的区别与用法

    一.synchronized和lock的用法区别 (1)synchronized(隐式锁):在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要 ...

  6. 详解synchronized与Lock的区别与使用

    知识点 1.线程与进程 在开始之前先把进程与线程进行区分一下,一个程序最少需要一个进程,而一个进程最少需要一个线程.关系是线程–>进程–>程序的大致组成结构.所以线程是程序执行流的最小单位 ...

  7. Java synchronized和 Lock 的区别与用法

    在分布式开发中,锁是线程控制的重要途径.Java为此也提供了2种锁机制,synchronized和lock.做为Java爱好者,自然少不了对比一下这2种机制,也能从中学到些分布式开发需要注意的地方.  ...

  8. 同步锁Synchronized与Lock的区别?

    synchronized与Lock两者区别: 1:Lock是一个接口,而Synchronized是关键字. 2:Synchronized会自动释放锁,而Lock必须手动释放锁. 3:Lock可以让等待 ...

  9. 锁、C#中Monitor和Lock以及区别

    1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁 ...

随机推荐

  1. Spring Boot使用AOP实现REST接口简易灵活的安全认证

    我们继续上一篇文章的分析,本文将通过AOP的方式实现一个相对更加简易灵活的API安全认证服务. 我们先看实现,然后介绍和分析AOP基本原理和常用术语. 一.Authorized实现 1.定义注解 pa ...

  2. 使用Sybmol模块来构建神经网络

    符号编程 在之前的文章,我们介绍了NDArray模块,它是MXNet中处理数据的核心模块,我们可以使用NDArray完成非常丰富的数学运算.实际上,我们完全可以使用NDArray来定义神经网络,这种方 ...

  3. 老罗最新发布了“子弹短信”这款IM,主打熟人社交能否对标微信?

    1.引言 2018年8月20日,锤子科技在北京召开了夏季新品发布会.除了新手机,发布会上还正式推出了主打语音功能的即时通讯IM聊天工具:子弹短信.这款工具此前今年早些时候在「鸟巢」发布会上初次亮相,在 ...

  4. OpenProject 分类专栏说明

    OpenProject 顾名思义 开源项目. 一.为何创建 OpenProject 专栏 主要是因为GitHub上收藏的项目越来越多,想在GitHub上查找一些收藏的内容,开始变得比较费时,为了简化搜 ...

  5. Javascript高级编程学习笔记(54)—— DOM2和DOM3(6)范围选择

    范围 为了让开发人员更加方便地控制页面“DOM2级遍历和范围”模块定义了“范围”接口 通过该接口开发人员可以选择文档中的一个区域,而不必考虑元素的界限 在常规操作不能有效地修改文档时,使用范围往往可以 ...

  6. Mysql学习笔记整理手册

    目录 (1) str_to_date (2) 递归查询 (3) 排序问题 (4) 条件函数 (5) 列转行函数 (6) find_int_set (7) 类型转换函数 (8) 合并更新 继上一篇博客& ...

  7. [Oracle]使用InstantClient访问Oracle数据库

    环境 操作系统: Win8.1 Enterprise Oracle开发工具: PL/SQL Developer 7.0.1.1066 (MBCS) 步骤 下载InstantClient Oracle官 ...

  8. HBase数据持久化之HRegion.flushcache即CF持久化

    我们从HRegion.flushcache开始分析.由于这个过程还是比较复杂的,因此,在这一节,我们不会分析的太过详细,只是单单的介绍一下其大体流程,待大家有了整体的把握之后,我们将在下一节详细介绍其 ...

  9. 3-7 Vue中的列表渲染

     举个案例:循环data中的list的值在div中,并显示相应的index值. 关于数组的循环: //显示效果如下图: //一般的列表渲染最好带一个key值,要把key值设置为唯一值的话,可以选择in ...

  10. iReport 5.6.0 安装包下载&安装

    iReport 5.6.0 下载 方式有两种: 1.在官网社区上下载,下载地址:https://community.jaspersoft.com/project/ireport-designer/re ...