两种方法之间的锁定使一种方法匮乏

Moo*_*lit 12 java concurrency file-io synchronization

在我的程序中,我有两种方法:

public void methodA() { //gets called very often
   //write something to file
}

public void methodB() {
  //write something to file
}
Run Code Online (Sandbox Code Playgroud)

methodA经常被客户调用,而methodB只是不时调用.但是,我需要确保无论何时客户想要调用methodB它都可以这样做(在可能的当前执行methodA完成之后).我尝试在每个方法中引入一个带锁定对象的同步块,但methodB似乎很饿,因为methodA更频繁地调用.我该如何解决这个问题?

Old*_*eon 10

听起来你需要公平 Lock.要创建其中一个,您应该true作为参数传递给构造函数.

Lock lock = new ReentrantLock(true);

public void methodA() {
    lock.lock();
    try {
        // Write something to a file.
    } finally {
        lock.unlock();
    }
}

public void methodB() {
    lock.lock();
    try {
        // Write something to a file.
    } finally {
        lock.unlock();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @ user1291235 - 使用公平锁定选项(将"true"传递给构造函数)优先考虑最长的等待线程并避免饥饿. (2认同)
  • 啊.这是其中一个具有关键字参数可以提高可读性的情况之一...`ReentrantLock(fair = true)`不需要知道API,以便了解代码正在做什么.如果没有这个,最好对那个孤独无意义的"真实"进行评论. (2认同)
  • @Bakuriu - 我感觉到你的痛苦 - 我会使用像enum Strategy {Fast,Fair}这样的东西,但这不会向后兼容. (2认同)