Java8就像一个宝藏,一个小的API改进,也足与写一篇文章,比如同步,一直是多线程并发编程的一个老话题,相信没有人喜欢同步的代码,这会降低应用的吞吐量等性能指标,最坏的时候会挂起死机,但是即使这样你也没得选择,因为要保证信息的正确性。所以本文决定将从synchronized、Lock到Java8新增的StampedLock进行对比分析,相信StampedLock不会让大家失望。

synchronized
在java5之前,实现同步主要是使用synchronized。它是Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
有四种不同的同步块:
1.实例方法
2.静态方法
3.实例方法中的同步块
4.静态方法中的同步块
大家对此应该不陌生,所以不多讲了,以下是代码示例
synchronized(this) // do operation }
小结:在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,性能上也有所提升。
Lock
它是Java 5在java.util.concurrent.locks新增的一个API。
Lock是一个接口,核心方法是lock(),unlock(),tryLock(),实现类有ReentrantLock, ReentrantReadWriteLock.ReadLock, ReentrantReadWriteLock.WriteLock;
ReentrantReadWriteLock, ReentrantLock 和synchronized锁都有相同的内存语义。
与synchronized不同的是,Lock完全用Java写成,在java这个层面是无关JVM实现的。Lock提供更灵活的锁机制,很多synchronized 没有提供的许多特性,比如锁投票,定时锁等候和中断锁等候,但因为lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中
下面是Lock的一个代码示例
rwlock.writeLock().lock();
try {
// do operation
} finally {
rwlock.writeLock().unlock();
}
小结:比synchronized更灵活、更具可伸缩性的锁定机制,但不管怎么说还是synchronized代码要更容易书写些
StampedLock
它是java8在java.util.concurrent.locks新增的一个API。
ReentrantReadWriteLock 在沒有任何读写锁时,才可以取得写入锁,这可用于实现了悲观读取(Pessimistic Reading),即如果执行中进行读取时,经常可能有另一执行要写入的需求,为了保持同步,ReentrantReadWriteLock 的读取锁定就可派上用场。
然而,如果读取执行情况很多,写入很少的情况下,使用 ReentrantReadWriteLock 可能会使写入线程遭遇饥饿(Starvation)问题,也就是写入线程吃吃无法竞争到锁定而一直处于等待状态。
StampedLock控制锁有三种模式(写,读,乐观读),一个StampedLock状态是由版本和模式两个部分组成,锁获取方法返回一个数字作为票据stamp,它用相应的锁状态表示并控制访问,数字0表示没有写锁被授权访问。在读锁上分为悲观锁和乐观锁。
所谓的乐观读模式,也就是若读的操作很多,写的操作很少的情况下,你可以乐观地认为,写入与读取同时发生几率很少,因此不悲观地使用完全的读取锁定,程序可以查看读取资料之后,是否遭到写入执行的变更,再采取后续的措施(重新读取变更信息,或者抛出异常) ,这一个小小改进,可大幅度提高程序的吞吐量!!
下面是java doc提供的StampedLock一个例子
class Point {
private double x, y;
private final StampedLock sl = new StampedLock();
void move(double deltaX, double deltaY) { // an exclusively locked method
long stamp = sl.writeLock();
try {
x += deltaX;
y += deltaY;
} finally {
sl.unlockWrite(stamp);
}
}
//下面看看乐观读锁案例
double distanceFromOrigin() { // A read-only method
long stamp = sl.tryOptimisticRead(); //获得一个乐观读锁
double currentX = x, currentY = y; //将两个字段读入本地局部变量
if (!sl.validate(stamp)) { //检查发出乐观读锁后同时是否有其他写锁发生?
stamp = sl.readLock(); //如果没有,我们再次获得一个读悲观锁
try {
currentX = x; // 将两个字段读入本地局部变量
currentY = y; // 将两个字段读入本地局部变量
} finally {
sl.unlockRead(stamp);
}
}
return Math.sqrt(currentX * currentX + currentY * currentY);
}
//下面是悲观读锁案例
void moveIfAtOrigin(double newX, double newY) { // upgrade
// Could instead start with optimistic, not read mode
long stamp = sl.readLock();
try {
while (x == 0.0 && y == 0.0) { //循环,检查当前状态是否符合
long ws = sl.tryConvertToWriteLock(stamp); //将读锁转为写锁
if (ws != 0L) { //这是确认转为写锁是否成功
stamp = ws; //如果成功 替换票据
x = newX; //进行状态改变
y = newY; //进行状态改变
break;
}
else { //如果不能成功转换为写锁
sl.unlockRead(stamp); //我们显式释放读锁
stamp = sl.writeLock(); //显式直接进行写锁 然后再通过循环再试
}
}
} finally {
sl.unlock(stamp); //释放读锁或写锁
}
}
}
小结:
StampedLock要比ReentrantReadWriteLock更加廉价,也就是消耗比较小。
StampedLock与ReadWriteLock性能对比
下图是和ReadWritLock相比,在一个线程情况下,是读速度其4倍左右,写是1倍。
下图是六个线程情况下,读性能是其几十倍,写性能也是近10倍左右:
下图是吞吐量提高:
总结
1、synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定;
2、ReentrantLock、ReentrantReadWriteLock,、StampedLock都是对象层面的锁定,要保证锁定一定会被释放,就必须将unLock()放到finally{}中;
3、StampedLock 对吞吐量有巨大的改进,特别是在读线程越来越多的场景下;
4、StampedLock有一个复杂的API,对于加锁操作,很容易误用其他方法;
5、当只有少量竞争者的时候,synchronized是一个很好的通用的锁实现;
6、当线程增长能够预估,ReentrantLock是一个很好的通用的锁实现;
# java8新特性
# java8
# stampedlock
# Java使用StampedLock实现高效读写功能
# Java中的StampedLock实现原理详解
# Java中的ReentrantLock、ReentrantReadWriteLock、Stamped
# Java利用StampedLock实现读写锁的方法详解
# java并发编程StampedLock高性能读写锁详解
# Java并发编程之StampedLock锁介绍
# Java StampedLock实现原理与最佳实践记录
# 是一个
# 它是
# 情况下
# 很好
# 多线程
# 的是
# 都是
# 这是
# 更灵活
# 这一
# 是在
# 都有
# 就必须
# 就像
# 你可以
# 最多
# 你也
# 是由
# 很多人
# 不多
相关文章:
建站之星代理费用多少?最新价格详情介绍
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法
魔毅自助建站系统:模板定制与SEO优化一键生成指南
常州企业网站制作公司,全国继续教育网怎么登录?
如何在阿里云虚拟服务器快速搭建网站?
建站主机核心功能解析:服务器选择与网站搭建流程指南
SQL查询语句优化的实用方法总结
北京企业网站设计制作公司,北京铁路集团官方网站?
宝塔建站后网页无法访问如何解决?
如何在Golang中引入测试模块_Golang测试包导入与使用实践
建站中国官网:模板定制+SEO优化+建站流程一站式指南
如何在服务器上三步完成建站并提升流量?
建站VPS能否同时实现高效与安全翻墙?
岳西云建站教程与模板下载_一站式快速建站系统操作指南
如何在IIS中新建站点并配置端口与IP地址?
如何选择高效便捷的WAP商城建站系统?
如何在云虚拟主机上快速搭建个人网站?
海南网站制作公司有哪些,海口网是哪家的?
建站主机CVM配置优化、SEO策略与性能提升指南
网站制作话术技巧,网站推广做的好怎么话术?
制作国外网站的软件,国外有哪些比较优质的网站推荐?
如何高效搭建专业期货交易平台网站?
Python路径拼接规范_跨平台处理说明【指导】
如何用已有域名快速搭建网站?
如何快速重置建站主机并恢复默认配置?
如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本
如何高效生成建站之星成品网站源码?
网站制作难吗安全吗,做一个网站需要多久时间?
如何选择高效可靠的多用户建站源码资源?
高防服务器租用如何选择配置与防御等级?
C++中引用和指针有什么区别?(代码说明)
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
b2c电商网站制作流程,b2c水平综合的电商平台?
焦点电影公司作品,电影焦点结局是什么?
如何选择靠谱的建站公司加盟品牌?
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
网站制作多少钱一个,建一个论坛网站大约需要多少钱?
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
制作农业网站的软件,比较好的农业网站推荐一下?
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
建站之星24小时客服电话如何获取?
网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
建站之星上传入口如何快速找到?
湖州网站制作公司有哪些,浙江中蓝新能源公司官网?
*请认真填写需求信息,我们会在24小时内与您取得联系。