http://blog.youkuaiyun.com/ghsau/article/details/7461369
Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题,我们拿Java线程(二)中的一个例子简单的实现一下和sychronized一样的效果,代码如下:
这样就实现了和sychronized一样的同步效果,需要注意的是,用sychronized修饰的方法或者语句块在代码执行完之后锁自动释放,而用Lock需要我们手动释放锁,所以为了保证锁最终被释放(发生异常情况),要把互斥区放在try内,释放锁放在finally内。
如果说这就是Lock,那么它不能成为同步问题更完美的处理方式,下面要介绍的是读写锁(ReadWriteLock),我们会有一种需求,在对数据进行读写的时候,为了保证数据的一致性和完整性,需要读和写是互斥的,写和写是互斥的,但是读和读是不需要互斥的,这样读和读不互斥性能更高些,来看一下不考虑互斥情况的代码原型:
部分输出结果:
我们要实现写入和写入互斥,读取和写入互斥,读取和读取互斥,在set和get方法加入sychronized修饰符:
部分输出结果:
我们发现,虽然写入和写入互斥了,读取和写入也互斥了,但是读取和读取之间也互斥了,不能并发执行,效率较低,用读写锁实现代码如下:
部分输出结果:
从结果可以看出实现了我们的需求,这只是锁的基本用法,锁的机制还需要继续深入学习。
本文来自:高爽|Coder,原文地址:http://blog.youkuaiyun.com/ghsau/article/details/7461369,转载请注明。
-
顶
- 25
-
踩
- 2
-
猜你在找
核心技术类目
全部主题
Hadoop
AWS
移动游戏
Java
Android
iOS
Swift
智能硬件
Docker
OpenStack
VPN
Spark
ERP
IE10
Eclipse
CRM
JavaScript
数据库
Ubuntu
NFC
WAP
jQuery
BI
HTML5
Spring
Apache
.NET
API
HTML
SDK
IIS
Fedora
XML
LBS
Unity
Splashtop
UML
components
Windows Mobile
Rails
QEMU
KDE
Cassandra
CloudStack
FTC
coremail
OPhone
CouchBase
云计算
iOS6
Rackspace
Web App
SpringSide
Maemo
Compuware
大数据
aptech
Perl
Tornado
Ruby
Hibernate
ThinkPHP
HBase
Pure
Solr
Angular
Cloud Foundry
Redis
Scala
Django
Bootstrap
- 文章搜索
- 个人资料
-
- 访问:1695896次
- 积分:11291
- 等级:
- 排名:第1180名
- 原创:95篇
- 转载:7篇
- 译文:3篇
- 评论:906条
- 详细资料
-
姓名:高爽
生日:1989.6
学历:本科
毕业:2012.7
学校: 黑龙江科技大学
公司: Qunar
邮箱: shuang.gao@qunar.com
私信有BUG,还有内容审核,有问题请发邮件。
- 博客专栏
Design Pattern 文章:6篇
阅读:29784Java线程 文章:15篇
阅读:628092
- 文章分类
- 阅读排行
- (129083)
- (100097)
- (93131)
- (76617)
- (71704)
- (64037)
- (55800)
- (55738)
- (42595)
- (41754)
- 评论排行
- (86)
- (84)
- (50)
- (45)
- (41)
- (39)
- (38)
- (34)
- (33)
- (28)
- 最新评论
: 非常棒,谢谢!
: @tcnf2015: 在登录web2的时候会重定向到sso系统,这个时候请求就会带上sso认证系...
: 博主,项目导入后运行出错,是我的环境没配好吗
: 博主,项目导入后运行出错,是我的环境没配好吗
: @pk111:用单例搞全局线程池呗
: @pk111:可以,我这里是demo,线程池作为一种池,就应该是全局使用的,但要合理的设置线程池大小...
: 不错的
: 楼主你好,请教个问题,高并发下,如果每个请求都新建一个线程池资源很容易耗尽,所以多个Completi...
: 路过
: O(∩_∩)O谢谢 一目了然
- 打赏
8楼 guzhichongshi 2017-01-18 11:48发表 [回复]-
-
你好,我想请问个锁的问题,现在有一个类a,实例化出了多个对象A,B,C,D……每个对象都是被多线程操作,单独操作一个对象的时候加锁住对象即可,但如果会同时操作多个对象要如何处理
Re: 三千分之一的爱 2017-03-13 10:41发表 [回复]-
-
回复guzhichongshi:锁住类
synchronized (a.class) {
}
7楼 pandajava 2016-05-31 14:15发表 [回复]-
-
学习学习学习学习学习
6楼 思念叨火车 2016-03-04 14:00发表 [回复]-
-
写的很好,受益良多。
但有一个疑惑:
文章中间例子提到:”我们要实现写入和写入互斥,读取和写入互斥,读取和读取互斥,在set和get方法加入sychronized修饰符“
只是这样操作就能做到读和写互斥吗?
能否解释一下?
Re: 张君君 2017-03-11 21:25发表 [回复]-
-
[reply]liyuchong2537631[/reply
已经调了一个对象的synchronize方法,再调用另一synchronize方法不可以,再调用另一非synchronize方法可以,再调用另一synchronize static方法可以
Re: 三千分之一的爱 2016-03-05 07:43发表 [回复]-
-
回复思念叨火车:synchronized锁的是对象,而不是某个方法。
5楼 秦子 2016-01-25 21:28发表 [回复]-
-
请问, private int data. 这个属性不加volatile关键字会不会有问题啊
Re: 三千分之一的爱 2016-01-27 08:48发表 [回复]-
-
回复秦子:不会
4楼 zsjxq_gg 2015-06-05 10:14发表 [回复]-
-
你举的最后一个例子里面,线程写的数据不一定能被读到,怎么保证线程写的数据一定能被另外一个线程读到呢
Re: 三千分之一的爱 2015-06-06 14:33发表 [回复]-
-
回复zsjxq_gg:肯定要先写入才能读到
3楼 程序员小董 2015-01-12 21:51发表 [回复]-
-
说实话 今天在你的并发专栏里 看的头都大了
一下子看的太多了 接受不了了
但我得说 你写的很好 已关注
Re: 三千分之一的爱 2015-01-16 11:21发表 [回复]-
-
回复程序员小董:呵呵,循序渐进
2楼 diquren 2013-12-11 16:54发表 [回复]-
-
get()方法里面,不写rwl.readLock().lock()也可以达到同样并发的效果吧
Re: 三千分之一的爱 2013-12-12 07:48发表 [回复]-
-
回复diquren:读和写也需要互斥。
Re: diquren 2013-12-13 15:52发表 [回复]-
-
回复三千分之一的爱:嗯明白了,有没办法,让方法同步,又是并发(不互斥)。比如:A线程调用了 对象obj的 get()的同步方法,同时B线程也可以调用对象obj的hello()同步方法。
Re: 三千分之一的爱 2013-12-16 12:24发表 [回复]-
-
回复diquren:用本文提到的读写锁就可以实现你说的这个效果啊,传统的synchronized是不行的。
Re: diquren 2013-12-17 12:18发表 [回复]-
-
回复三千分之一的爱:比如你文章最后输出:Thread-4准备读取数据 Thread-3准备读取数据 Thread-5准备读取数据 读与读并不是同步的。一个同步方法用一个单独的Lock对象(两个同步,就要两个Lock),我试了,可以达到效果。
1楼 nuonuodaodao 2012-04-14 22:35发表 [回复]-
-
顶,并发包还没掌握
Re: 三千分之一的爱 2012-04-14 22:38发表 [回复]-
-
回复nuonuodaodao:呵呵,我也是初步学习。