专栏首页我是攻城师理解Java并发包里面中的Lock

理解Java并发包里面中的Lock

前言

在Java多线程编程中,Lock对象与前面分析过的Atomic系列的类都属于高级别的并发工具其在Java里面与内置锁synchronized关键字的作用类似,但功能却比synchronized更加强大和灵活。

锁的作用

锁的作用主要是为了守卫(guard)共享资源存在的,例如数据库,文件系统,数字计数器或者一个消息进程等等。

Lock介绍

Lock接口是jdk5之后引入的高级工具类,完整的包名是java.util.concurrent.locks.Lock它自身是一个接口不能直接被实例化,它下面提供了两个子类分别是:

ReentrantLock
ReentrantReadWriteLock

其中ReentrantReadWriteLock内部实现了读写锁,两个静态类分别是:

ReentrantReadWriteLock.ReadLock
ReentrantReadWriteLock.WriteLock

一个通用的使用lock的模板写法如下:

Lock l = new ReentrantLock(); 

l.lock(); try { 

// access the resource protected by this lock 

} finally 
{ 
  l.unlock(); 

}

ReentrantLock vs Synchronized

大部分时候我们都会使用ReentrantLock作为Lock的实现,其是Lock接口的一个实现类,提供了互斥锁的功能。那么它与synchronized相比有什么特点呢?

(1)ReentrantLock提供了公平性保证,而synchronized唤醒的线程都是随机的,没办法做到让BLOCK时间最长的线程先执行任务,而ReentrantLock则可以做到。

(2)提供了tryLock()方法,可以用来实现非阻塞式编程,如果tryLock成功就会获得锁然后执行,否则就继续去干别的事过一会再来看看是否可以索取,另一种方式是tryLock(timeout)可以指定一定的时间周期如果在此之内获得锁就执行,否则就先去干别的事,从而减少了线程的BLOCK状态。

(3)可以执行lockInterruptibly()方法对阻塞的线程进行打断,在synchronized中处于等待的线程是没法进行控制的

(4)提供了api可以获取当前阻塞的线程有多少个。

最后ReentrantLock相比synchronized有一些缺点:

增加了代码复杂度,在其出现的地方必须使用try-finally语句,而synchroized则是隐藏了加锁解锁的细节,比较精简不容易出错,如果忘记了释放锁那么有可能导致出现无限循环。

总结

本文主要介绍了Java里面高级并发工具Lock接口的使用,以及其子类ReentrantLock特点与synchronized相比的优缺点,总得来说Lock接口提供了更加丰富api和灵活的功能,但同时也带来了编码的复杂性。如果一个程序员忘记了在finally块中释放锁,那么很有导致其他一些莫名奇妙的问题,从这一点来说在比较简单的多线程代码中还是优先推荐使用synchronized关键字来同步。

本文分享自微信公众号 - 我是攻城师(woshigcs)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-07-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 学习使用Lock+Conditionk编写三个经典多线程例子

    在jdk5之后的高级并发包里面Lock接口可以替换原来jvm内置的锁synchronized关键字,同理使用Condition接口的await,signal,s...

    我是攻城师
  • 多个线程如何轮流打印ABC特定的次数?

    这类问题其实并不难,只要掌握了Java里面线程协作和锁的知识,就可以轻而易举的搞定:

    我是攻城师
  • 多线程协作打印ABC之ReentrantLock版本

    我们介绍了在Java里面使用synchronized + wait/notifyAll实现的多线程轮流打印特定的字符串,输出的结果如下:

    我是攻城师
  • 机器学习系列 3:梯度下降

    梯度下降(Gradient descent)是一个用来求代价函数最小值的算法。梯度下降算法的思想就是首先先从一组参数值(θ0, θ1)开始,不断地去尝试各种(θ...

    SuperFeng
  • Vue 列表渲染 v-for循环

    Element UI手册:https://cloud.tencent.com/developer/doc/1270 中文文档:http://element-c...

    祈澈菇凉
  • 前沿 | 减少30%流量,增加清晰度:MIT提出人工智能视频缓存新算法

    机器之心
  • 【亲测有效】Kali Linux无法安装网易云音乐的解决方案

    由于 Kali Linux 的内核是基于 Debian 的,我们在安装网易云音乐的时候更偏向于选择安装网易云音乐 v1.1.0 deepin15(64位) 的包...

    Angel_Kitty
  • spring cloud config 加密出现"status":"NO_KEY"的解决方法

    {"description":"No key was installed for encryption service","status":"NO_KEY"}

    lyb-geek
  • 理解Java并发里面的CAS概念

    我们知道在Java多线程里面关于共享变量的操作,一定是要使用线程同步来保证线程安全的,一旦涉及线程同步,就需要加锁,一旦加锁就意味着某一个时候只能有一个线程在操...

    我是攻城师
  • 处理gateway service使用过程中遇到的400 error - Malformed URI literal syntax

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    Jerry Wang

扫码关注云+社区

领取腾讯云代金券