代码之家  ›  专栏  ›  技术社区  ›  Vicky

终止将要进入同步资源等待状态的线程

  •  -1
  • Vicky  · 技术社区  · 7 年前

    private void doSomething(Map<String, String> someArguments) throws CustomException {
      MyEnum runType = getRunType(someArguments);
      switch (runType) {
            case FRUIT:
                 new FruitClass().workNow();
                 break;
    
            case VEGETABLE:
                 new VegetableClass().workNow();
                 break;
    
            default:
                // log that the type is not known 
          }
       }
    

    workNow 就像:

    workNow() throws CustomException
    

    立即工作 方法运行了几分钟并做了一些工作。我的问题是 立即工作 对于 FRUIT VEGETABLE )正在进行,另一个调用以相同的类型发生( FruitClass 实例并开始执行其 平行地。

    private void doSomething(Map<String, String> someArguments) {
        MyEnum runType = getRunType(someArguments);
        switch (runType) {
            case FRUIT:
                synchronized (FruitClass.class){
                    new FruitClass().workNow();
                }
                break;
    
            case VEGETABLE:
                synchronized (VegetableClass.class){
                    new VegetableClass().workNow();
                }
                break;
    
            default:
                // log that the type is not known 
        }
    }
    

    从答案到 this question

    这个很好用。但是它在同步类上构建了一个等待线程队列,一旦前一个线程释放锁,它就会获得锁。

    为了增强我的知识,有没有一种方法可以确定当线程进入并看到类上的锁时,它不是等待,而是终止。

    . 让我把门锁上 水果类 . 哦!另一个线程已经有了锁并且正在执行 立即工作 . 我什么都不用做。“终止。”

    编辑1:

    从下面的答案来看:

    final Lock reentrantLock = new ReentrantLock();
    
    private void doSomething(Map<String, String> someArguments) {
        MyEnum runType = getRunType(someArguments);
        switch (runType) {
            case FRUIT:
                if(reentrantLock.tryLock()) {
                   try {
                       new FruitClass().workNow();
                    } finally {
                       reentrantLock.unlock();
                    }
                } else {
                  // do nothing and terminate
                }
                break;
    
            case VEGETABLE:
                synchronized (VegetableClass.class){
                    new VegetableClass().workNow();
                }
                break;
    
            default:
                // log that the type is not known 
        }
    }
    

    然而,这显然行不通。因为这只会实例化新的 水果类

    正如我最初的问题所说,如果一个对象已经创建并且正在执行,我想锁定新对象本身的创建 立即工作

    如何使用锁实现这一点?

    我不知道这样的事情是否可能:

    final Lock reentrantLock = new ReentrantLock(FruitClass.class);
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Mark Bramnik    7 年前

    如果我问得对的话,您正在使用更“细粒度”的方法来处理java同步。使用“synchronized”不仅不够灵活。

    解决这个问题的一种方法是使用 java.util.concurrent.locks

    锁在那里特别优惠 tryLock