没有合适的资源?快使用搜索试试~ 我知道了~
JDK 5.0 中更灵活、更具可伸缩性的锁定机制1
需积分: 0 0 下载量 86 浏览量
2022-08-08
20:40:49
上传
评论
收藏 247KB DOCX 举报
温馨提示
试读
7页
一般来说,线程以某种不必让其他线程立即可以看到的方式(不管这些线程在寄存器中、在处理器特定的缓存中,还是通过指令重排或者其他编译器优化),不受缓存变量值的约束,
资源详情
资源评论
资源推荐
JDK 5.0 中更灵活、更具可伸缩性的锁定机制
简介: JDK 5.0 为开发人员开发高性能的并发应用程序提供了一些很有效的新选择。例如,
java.util.concurrent.lock 中的类 ReentrantLock 被作为 Java 语言中
synchronized 功能的替代,它具有相同的内存语义、相同的锁定,但在争用条件下却有
更好的性能,此外,它还有 synchronized 没有提供的其他特性。这是否意味着我们应当
忘记 synchronized ,转而只用 ReentrantLock 呢?并发性专家 Brian Goetz 刚从
他的夏季休假中返回,他将为我们提供答案。
多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线
程模型和正规的内存模型集成到语言中的主流语言。核心类库包含一个 Thread 类,可以用它来构建、
启动和操纵线程,Java 语言包括了跨线程传达并发性约束的构造 —— synchronized 和
volatile 。在简化与平台无关的并发类的开发的同时,它决没有使并发类的编写工作变得更繁琐,
只是使它变得更容易了。
synchronized 快速回顾
把代码块声明为 synchronized,有两个重要后果,通常是指该代码具有
原子性(
atomicity
)
和
可见性
(
visibility
)
。原子性意味着一个线程一次只能执行由一个指定监控对象(lock)保护的代码,从而防止多
个线程在更新共享状态时相互冲突。可见性则更为微妙;它要对付内存缓存和编译器优化的各种反常行为。
一般来说,线程以某种不必让其他线程立即可以看到的方式(不管这些线程在寄存器中、在处理器特定的
缓存中,还是通过指令重排或者其他编译器优化),不受缓存变量值的约束,但是如果开发人员使用了同
步,如下面的代码所示,那么运行库将确保某一线程对变量所做的更新先于对现有 synchronized
块所进行的更新,当进入由同一监控器(lock)保护的另一个 synchronized 块时,将立刻可以看
到这些对变量所做的更新。类似的规则也存在于 volatile 变量上。(有关同步和 Java 内存模型的
内容,请参阅 参考资料。)
synchronized (lockObject) {
// update object state
}
所以,实现同步操作需要考虑安全更新多个共享变量所需的一切,不能有争用条件,不能破坏数据(假设
同步的边界位置正确),而且要保证正确同步的其他线程可以看到这些变量的最新值。通过定义一个清晰
的、跨平台的内存模型(该模型在 JDK 5.0 中做了修改,改正了原来定义中的某些错误),通过遵守下面
这个简单规则,构建“一次编写,随处运行”的并发类是有可能的:
不论什么时候,只要您将编写的变量接下来可能被另一个线程读取,或者您将读取的变量最后是被另一个
线程写入的,那么您必须进行同步。
不过现在好了一点,在最近的 JVM 中,没有争用的同步(一个线程拥有锁的时候,没有其他线程企图获
得锁)的性能成本还是很低的。(也不总是这样;早期 JVM 中的同步还没有优化,所以让很多人都这样
认为,但是现在这变成了一种误解,人们认为不管是不是争用,同步都有很高的性能成本。)
回页首
shkpwbdkak
- 粉丝: 30
- 资源: 300
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Yolov8改进---注意力机制:Polarized Self-Attention,效果秒杀CBAM、SE.html
- 人才网站设计-asp.net+sql-(系统源码)
- asp.net+sql人才网站设计-含系统源码
- C#应用的用户配置窗体方案
- python实现绘制爱心图形的代码
- JAVAWEB项目-校园订餐系统项目源码.zip
- flink-1.19.0-bin-scala-2.12.tgz flink-1.16.3-bin-scala-2.12.tgz
- javaWeb项目-物资管理系统项目源码.zip
- javaweb项目-物流配货项目源码.zip
- 使用C++基于颜色纹理特征的人脸活体检测实现-附项目源码.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0