java unlock_java – 古怪的StampedLock.unlock(长)行为?
我面临着一个关于
StampedLock的奇怪行为.以下是主要有问题的代码行:
StampedLock lock = new StampedLock();
long stamp1 = lock.readLock();
System.out.printf("Read lock count: %d%n", lock.getReadLockCount());
lock.unlock(stamp1 + 2);
System.out.printf("Read lock count: %d%n", lock.getReadLockCount());
奇怪的行为是关于如何解锁“容忍”错误的读取标记.你觉得这样对吗?
这里是参考的完整代码:
public class StampedLockExample {
static StampedLock lock = new StampedLock();
static void println(String message, Object... args) {
System.out.printf(message, args);
System.out.println();
}
static void printReadLockCount() {
println("Lock count=%d", lock.getReadLockCount());
}
static long tryReadLock() {
long stamp = lock.tryReadLock();
println("Gets read lock (%d)", stamp);
printReadLockCount();
return stamp;
}
static long tryWriteLock() {
long stamp = lock.tryWriteLock();
println("Gets write lock (%d)", stamp);
return stamp;
}
static long tryConvertToReadLock(long stamp) {
long newOne = lock.tryConvertToReadLock(stamp);
println("Gets read lock (%d -> %d)", stamp, newOne);
printReadLockCount();
return newOne;
}
static void tryUnlock(long stamp) {
try {
lock.unlock(stamp);
println("Unlock (%d) successfully", stamp);
} catch (IllegalMonitorStateException e) {
println("Unlock (%d) failed", stamp);
}
printReadLockCount();
}
public static void main(String[] args) {
println("%n--- Gets two read locks ---");
long stamp1 = tryReadLock();
long stamp2 = tryReadLock();
long min = Math.min(stamp1, stamp2);
long max = Math.max(stamp1, stamp2);
println("%n--- Tries unlock (-1 / +2 / +4) ---");
tryUnlock(min - 1);
tryUnlock(max + 2);
tryUnlock(max + 4);
println("%n--- Gets write lock ---");
long stamp3 = tryWriteLock();
println("%n--- Tries unlock (-1 / +1) ---");
tryUnlock(stamp3 - 1);
tryUnlock(stamp3 + 1);
println("%n--- Tries write > read conversion ---");
long stamp4 = tryConvertToReadLock(stamp3);
println("%n--- Tries unlock last write stamp (-1 / 0 / +1) ---");
tryUnlock(stamp3 - 1);
tryUnlock(stamp3);
tryUnlock(stamp3 + 1);
println("%n--- Tries unlock (-1 / +1) ---");
tryUnlock(stamp4 - 1);
tryUnlock(stamp4 + 1);
}
}
输出:
--- Gets two read locks ---
Gets read lock (257)
Lock count=1
Gets read lock (258)
Lock count=2
--- Tries unlock (-1 / +2 / +4) ---
Unlock (256) failed
Lock count=2
Unlock (260) successfully
Lock count=1
Unlock (262) successfully
Lock count=0
--- Gets write lock ---
Gets write lock (384)
--- Tries unlock (-1 / +1) ---
Unlock (383) failed
Lock count=0
Unlock (385) failed
Lock count=0
--- Tries write > read conversion ---
Gets read lock (384 -> 513)
Lock count=1
--- Tries unlock last write stamp (-1 / 0 / +1) ---
Unlock (383) failed
Lock count=1
Unlock (384) failed
Lock count=1
Unlock (385) failed
Lock count=1
--- Tries unlock (-1 / +1) ---
Unlock (512) failed
Lock count=1
Unlock (514) successfully
Lock count=0
java unlock_java – 古怪的StampedLock.unlock(长)行为?相关推荐
- Java通过FFMPEG获取视频时长
2019独角兽企业重金招聘Python工程师标准>>> Java通过FFMPEG获取视频时长 详见https://www.yz1618.cn/view/19 转载于:https:// ...
- 【java程序员必备上班时长计算器】
java代码,根据程序员每天打卡时间,获取上班总时长,上班天数,平均上班时长,超出要求时间,为了方便大家把握时间节奏,合理规划下班时间: 一:效果图片 二:工具类 package com.compan ...
- Java获取播放文件的时长
package org.jeecg.modules.diy.util;import it.sauronsoftware.jave.Encoder; import it.sauronsoftware.j ...
- java 读取音频/视频 文件时长
java 读取音频/视频 文件时长 支持mp3,mp4,mov,m4a,wav 格式文件 源码 https://github.com/opensourceteams/java-maven-projec ...
- 用Java实现:设有一根长3000m 的绳子,每天减一半,需要几天的时间,绳子的长度会短于5m?
Java练习:设有一根长3000m 的绳子,每天减一半,需要几天的时间,绳子的长度会短于5m? Java程序语言设计课后习题4.11 源代码如下: public class Rope4_11 {pub ...
- java:键盘录入长方形的长和宽,计算长方形的周长和面积,请使用面向对象的方式解决!
java:键盘录入长方形的长和宽,计算长方形的周长和面积,请使用面向对象的方式解决! //测试类: public class Test {public static void main(String[ ...
- 2021-09-10 java 读取音频/视频 文件时长
java 读取音频/视频 文件时长 pom.xml <dependency><groupId>org</groupId><artifactId>jaud ...
- 深读源码-java同步系列之StampedLock源码解析
问题 (1)StampedLock是什么? (2)StampedLock具有什么特性? (3)StampedLock是否支持可重入? (4)StampedLock与ReentrantReadWrite ...
- java memcachedclient_Java memcached client怎样建立长连接
摇曳的蔷薇 package com.ghj.packageofclient;import java.util.Date;import junit.framework.TestCase;import c ...
最新文章
- linux lnmp yum,yum安装LNMP
- 检查JavaScript中变量是数字还是字符串
- 2017百度之星程序设计大赛 - 初赛(A)数据分割
- MATLAB数字图像处理学习笔记
- 从明面上学习ASP.NET Core
- [html] 你是如何理解html与css分离的?
- 一步步编写操作系统 61 任务状态段 TSS
- java jvm内存地址_JVM--Java内存区域
- java web批量下载_JAVAWEB批量文件下载器
- iOS版微信跟上了!已支持改微信号,修改后好友不会收到提醒
- Android热修复Java类_Android 热修复(一)
- python读取数据集前十行_Python读取数据集并消除数据中的空行方法
- html中异步上传文件实现示例,HTML_html中异步上传文件实现示例,复制代码代码如下: form actio - phpStudy...
- OSCache操作详解+标签使用
- linux运行非法指令,illegal instruction非法指令的解决思路
- FastDFS配置Nginx模块
- 算法突击训练营:开学第1课 听课总结
- 山东大学创新项目实训个人工作日志(十四)
- filter grok 判断_logstash grok使用案例
- CST学习:圆形贴片天线四元阵设计(一)阵元设计
热门文章
- 为什么你的下一餐要交给机器人?
- OUC-移动软件开发-实验4
- 用wegame启动lol显示服务器维护,wegame启动不了英雄联盟(wegame点启动又弹回界面)...
- 网站推广工具,怎么推广?
- Python3 学习笔记
- JAVA简单实现坦克对战(只有坦克和子弹)
- java 调节color亮度算法_照片处理-饱和度调节
- 安卓国际化之strings.xml导入Excel表格及从excel恢复到Strings.xml中
- 提升计算机英语的阅读,计算机专业英语教程阅读
- c语言随机产生100个字母,C语言实现生成1到100随机数的方法