Java中的锁:Lock和synchronized的区别

欢迎关注微信公众号:互联网全栈架构
Java并发编程中,我们经常需要给代码块或者方法加锁,而常用的加锁方法有Lock和synchronized,那么,这两者有什么区别呢?搞清楚这两者之的异同,除了对日常的编程工作有帮助外,它也常常出现在面试题目当中。我们先逐条分析它们的主要区别,在文章最后再用一个表格进行总结,以便对于这个知识点能够一目了然。
一、首先,Lock是Java的一个接口,是JDK提供的API,而synchronized是Java的关键字,在几十个Java关键字中,它赫然在列。
二、线程获取synchronized锁,在执行完成后会自动释放锁,而Lock需要手动进行释放。为了更好地理解两者之间的差异,我们用一个简单的例子来进行说明,定义两个简单的并发类用于计数,分别用synchronized关键字和Lock接口加锁:
package com.sample.multithread.base;
// 使用synchronized关键字加锁
public class SynchronizedDemo {
    private long count = 0;
    // 计数器加1
    public synchronized void add(){
        count++;
    }
    // 获取计数器的值
    public synchronized long getCount(){
        return count;
    }
}

package com.sample.multithread.base;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
// 使用接口Lock加锁
public class LockDemo {
    private long count = 0;
    // Lock的接口实现类,通常使用ReentrantLock
    private Lock lock = new ReentrantLock();
    // 计数器加1
    public void add(){
        lock.lock();
        try{
            count++;
        }finally {
            lock.unlock();
        }
    }
    // 获取计数器的值
    public long getCount(){
        lock.lock();
        try{
            return count;
        }finally {
            lock.unlock();
        }
    }
}
从上面的代码可以看出,因为synchronized是Java的关键字,所以它的代码要简洁得多,而Lock接口需要手动调用方法进行加锁,在使用完成后,还需要调用unlock方法手动解锁。

另外,对于synchronized关键字,在代码正常执行完成以后,线程就会自动释放锁,如果代码发生异常,或者调用对象的wait方法时,线程也会自动释放锁。

三、Lock可以通过tryLock方法判断锁的状态,而synchronized没有办法来查询锁的状态。另外,tryLock还可以指定超时时间,如果在指定的时间范围内没有获得锁,则返回false。

四、synchronized可以锁住方法和代码块,而Lock只能锁住代码块。

五、synchronized是非公平锁,且不支持公平锁,而Lock默认是非公平锁,也支持公平锁。

六、从应用场景来说,如果是简单的并发场景,使用synchronized比较适合,但对于资源竞争比较激烈,或者锁控制粒度更细的场景中,使用Lock会更合适。

下面用一个表格来总结一下两者的主区别:

Java中的锁:Lock和synchronized的区别

都看到这里了,请帮忙一键三连啊,也就是点击文末的在看、点赞、分享,这样会让我的文章让更多人看到,也会大大地激励我进行更多的输出,谢谢!

鸣谢:
https://www.geeksforgeeks.org/lock-framework-vs-thread-synchronization-in-java/

推荐阅读:

NoSQL中的翘楚:MongoDB入门介绍

臭名昭著,怙恶不悛的OOM,到底是什么?

ZooKeeper集群安装

俯拾皆是的Java注解,你真的get了吗?

“八面玲珑”的ZooKeeper入门介绍

责无旁贷:超酷的责任链模式

聚沙成塔:聊聊建造者模式

公司裁员,码农竟然成了“帮凶”?(剧情杜撰)

原文始发于微信公众号(互联网全栈架构):Java中的锁:Lock和synchronized的区别

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/173559.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!