我尝试了一些使用更高级别构造的尝试,但没有想到任何事情.我认为这可能是一个下降到低级API的机会:

EDIT: I actually think you’re trying to set up a problem which is inherently tricky (see second to last paragraph) and probably not needed (see last paragraph). But that said, here’s how it could be done, and I’ll leave the color commentary for the end of this answer.

private int someMethod1Invocations = 0;

private int someMethod2Invocations = 0;

public void someMethod1() {

synchronized(this) {

// Wait for there to be no someMethod2 invocations -- but

// don't wait on any someMethod1 invocations.

// Once all someMethod2s are done, increment someMethod1Invocations

// to signify that we're running, and proceed

while (someMethod2Invocations > 0)

wait();

someMethod1Invocations++;

}

// your code here

synchronized (this) {

// We're done with this method, so decrement someMethod1Invocations

// and wake up any threads that were waiting for that to hit 0.

someMethod1Invocations--;

notifyAll();

}

}

public void someMethod2() {

// comments are all ditto the above

synchronized(this) {

while (someMethod1Invocations > 0)

wait();

someMethod2Invocations++;

}

// your code here

synchronized(this) {

someMethod2Invocations--;

notifyAll();

}

}

上面的一个明显问题是它可以导致thread starvation.例如,someMethod1()正在运行(并阻塞someMethod2()s),就在它即将完成时,另一个线程出现并调用someMethod1().进行得很好,就像它完成另一个线程启动someMethod1(),依此类推.在这种情况下,someMethod2()永远不会有机会运行.这实际上并不是上述代码中的错误;这是您的设计需求的一个问题,一个好的解决方案应该积极解决.我认为公平AbstractQueuedSynchronizer可以做到这一点,尽管这是一个留给读者的练习. ?

最后,我无法抗拒但是插入一个意见:鉴于ConcurrentHashMap操作非常快,你可能最好只是在两个方法中放置一个互斥锁并完成它.所以是的,线程必须排队以调用someMethod1(),但是每个线程都会非常快速地完成它(因此让其他线程继续).这应该不是问题.

java 方法互斥_java – 互斥方法相关推荐

  1. java 静态方法覆盖_Java中方法的覆盖和静态方法的隐藏

    下面的程序对巴辛吉小鬣狗和其它狗之间的行为差异进行了建模.如果你不知道 什么是巴辛吉小鬣狗,那么我告诉你,这是一种产自非洲的小型卷尾狗,它们从 来都不叫唤.那么,这个程序将打印出什么呢? class ...

  2. java 传入参数_Java 中方法参数的传递

    java中方法参数传递看似有两种,值传递和引用传递.而实际上都是值传递. 所谓值传递,传递的是变量的副本就是说,在将变量a作为参数传进方法中时,方法中接收到的是a的副本,在方法中对参数的修改实际上修改 ...

  3. java native 例子_Java native方法以及JNI实践

    前言 今天看AndFix实现时,核心方法之ReplaceMethod方法是一个native方法,之前并没有遇到过,所以在此整理记录. native的作用 总而言之:native是与C++联合开发的时候 ...

  4. java 虚类_java虚方法

    java虚方法 我们已经讨论了方法的重载,也就是子类能够重载父类的方法.以下是小编为大家搜索整理的java虚方法,欢迎大家阅读!更多精彩内容请及时关注我们应届毕业生考试网! 当子类对象调用重载的方法时 ...

  5. java内容寻址_java – 获取方法对象而不按名称寻址方法

    有没有办法获取方法对象而不必使用方法的名称来获取它? 例如,我有班级: class Car { public String drive(); public String giveUp(); publi ...

  6. java 方法引用_JAVA 8 方法引用 - Method References

    什么是方法引用 简单地说,就是一个Lambda表达式.在Java 8中,我们会使用Lambda表达式创建匿名方法,但是有时候,我们的Lambda表达式可能仅仅调用一个已存在的方法,而不做任何其它事,对 ...

  7. java finalize逃脱_java finalize方法详解

    1. finalize的作用 finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法. finalize()与C++中的析构函数 ...

  8. java日历教程_JAVA Calendar方法使用基础教程详解

    究竟什么是一个 Calendar 呢?中文的翻译就是日历,那我们立刻可以想到我们生活中有阳(公)历.阴(农)历之分.它们的区别在哪呢? 比如有: 月份的定义 – 阳`(公)历 一年12 个月,每个月的 ...

  9. java 重载 返回_java – 返回方法重载

    我是Java的新手,我自己也在学习.我尝试重载方法时遇到了麻烦.这是代码 public static void main(String[] args) { calculateScore(); calc ...

最新文章

  1. 基于Sobel计算图像梯度图
  2. mybatis =或这个=提示错误Tag name expecte问题解决
  3. 日志模块 logging
  4. 关键词提取_NLP 关键词 提取 实战 案例
  5. 华为云——给【服务器】一个温暖的家
  6. mysql查询缓慢原因和解决方案
  7. JavaScript实现按键精灵
  8. c++类指针赋值表达式必须是可修改的左值_C++学习刷题8--复制构造函数和赋值运算符重载函数...
  9. 怎么查看linux文件夹下有多少个文件
  10. java皮肤_java程序的皮肤效果实现代码
  11. git解决冲突 merge 不提示_Merge,Rebase,Cherry-Pick 了解一下
  12. 倪光南、求伯君“出山”:爱解 Bug、无惧“35岁魔咒”、编码之路痛并快乐!...
  13. 怎么复制黑苹果config配置_只需3步,实现黑苹果USB端口配置
  14. 清理c盘、c盘哪些文件可以删、图形显示文件大小软件
  15. 基于Grafana的监控报警平台
  16. 2018世界互联网大会首日,丁磊马化腾雷军等都说了啥?
  17. 一度智信|关于拼多多店铺数据分析细节
  18. Markdown插入url图片
  19. Fiddler 抓包HTTPS包,抓手机包
  20. 取模运算总结 - 数论

热门文章

  1. Python在命令行模式下如何退出命令行
  2. 三维动画设计与制作【2】
  3. background-size的几种取值
  4. Java绘画板源码_Java 绘图板 示例源码下载(画板)
  5. 关于localhost
  6. 什么是变量,和变量的类型
  7. w3cschool菜鸟教程离线版chm手册正式发布
  8. matlab 邦加球,吴先良(软件学院)老师 - 安徽大学
  9. 企业邮箱签名设置攻略,注册邮箱后一定要做的事
  10. python3实现链表的基础操作