我面临着一个关于

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(长)行为?相关推荐

  1. Java通过FFMPEG获取视频时长

    2019独角兽企业重金招聘Python工程师标准>>> Java通过FFMPEG获取视频时长 详见https://www.yz1618.cn/view/19 转载于:https:// ...

  2. 【java程序员必备上班时长计算器】

    java代码,根据程序员每天打卡时间,获取上班总时长,上班天数,平均上班时长,超出要求时间,为了方便大家把握时间节奏,合理规划下班时间: 一:效果图片 二:工具类 package com.compan ...

  3. Java获取播放文件的时长

    package org.jeecg.modules.diy.util;import it.sauronsoftware.jave.Encoder; import it.sauronsoftware.j ...

  4. java 读取音频/视频 文件时长

    java 读取音频/视频 文件时长 支持mp3,mp4,mov,m4a,wav 格式文件 源码 https://github.com/opensourceteams/java-maven-projec ...

  5. 用Java实现:设有一根长3000m 的绳子,每天减一半,需要几天的时间,绳子的长度会短于5m?

    Java练习:设有一根长3000m 的绳子,每天减一半,需要几天的时间,绳子的长度会短于5m? Java程序语言设计课后习题4.11 源代码如下: public class Rope4_11 {pub ...

  6. java:键盘录入长方形的长和宽,计算长方形的周长和面积,请使用面向对象的方式解决!

    java:键盘录入长方形的长和宽,计算长方形的周长和面积,请使用面向对象的方式解决! //测试类: public class Test {public static void main(String[ ...

  7. 2021-09-10 java 读取音频/视频 文件时长

    java 读取音频/视频 文件时长 pom.xml <dependency><groupId>org</groupId><artifactId>jaud ...

  8. 深读源码-java同步系列之StampedLock源码解析

    问题 (1)StampedLock是什么? (2)StampedLock具有什么特性? (3)StampedLock是否支持可重入? (4)StampedLock与ReentrantReadWrite ...

  9. java memcachedclient_Java memcached client怎样建立长连接

    摇曳的蔷薇 package com.ghj.packageofclient;import java.util.Date;import junit.framework.TestCase;import c ...

最新文章

  1. linux lnmp yum,yum安装LNMP
  2. 检查JavaScript中变量是数字还是字符串
  3. 2017百度之星程序设计大赛 - 初赛(A)数据分割
  4. MATLAB数字图像处理学习笔记
  5. 从明面上学习ASP.NET Core
  6. [html] 你是如何理解html与css分离的?
  7. 一步步编写操作系统 61 任务状态段 TSS
  8. java jvm内存地址_JVM--Java内存区域
  9. java web批量下载_JAVAWEB批量文件下载器
  10. iOS版微信跟上了!已支持改微信号,修改后好友不会收到提醒
  11. Android热修复Java类_Android 热修复(一)
  12. python读取数据集前十行_Python读取数据集并消除数据中的空行方法
  13. html中异步上传文件实现示例,HTML_html中异步上传文件实现示例,复制代码代码如下: form actio - phpStudy...
  14. OSCache操作详解+标签使用
  15. linux运行非法指令,illegal instruction非法指令的解决思路
  16. FastDFS配置Nginx模块
  17. 算法突击训练营:开学第1课 听课总结
  18. 山东大学创新项目实训个人工作日志(十四)
  19. filter grok 判断_logstash grok使用案例
  20. CST学习:圆形贴片天线四元阵设计(一)阵元设计

热门文章

  1. 为什么你的下一餐要交给机器人?
  2. OUC-移动软件开发-实验4
  3. 用wegame启动lol显示服务器维护,wegame启动不了英雄联盟(wegame点启动又弹回界面)...
  4. 网站推广工具,怎么推广?
  5. Python3 学习笔记
  6. JAVA简单实现坦克对战(只有坦克和子弹)
  7. java 调节color亮度算法_照片处理-饱和度调节
  8. 安卓国际化之strings.xml导入Excel表格及从excel恢复到Strings.xml中
  9. 提升计算机英语的阅读,计算机专业英语教程阅读
  10. c语言随机产生100个字母,C语言实现生成1到100随机数的方法