【问题标题】:Multiple instances of class using synchronized method使用同步方法的类的多个实例
【发布时间】:2019-03-24 13:26:58
【问题描述】:

我现在正在编写一些东西,其中我有一个对象的多个实例化,它们都在单独的线程中运行。我想要一个同步方法,一次只能执行一个对象的实例化。我知道 synchronized 关键字不起作用,因为它仅适用于对象的单个实例化,并且使整个方法 static 不是一个真正的选择。目前我正在使用staticboolean,线程检查该方法是否与Thread.sleep() 方法调用一起被占用。它看起来像这样:

    while(occupied){
        Thread.sleep(randomGenerator.nextInt(1000) + 500);
    }

    occupied = true;
    int bufferLength = outputBuffer.size();

    System.out.println(name + "Size=" + outputBuffer.size());
    System.out.print(name + ": ");

    for(int i=0; i<bufferLength; i++){
        System.out.print(outputBuffer.take().get("Order Number") + ",");
    }

    System.out.println("\n" + name + " is finished.\n");

    occupied = false;

boolean occupied 是在我的对象的 4 个实例之间共享的静态变量。

这让我得到了想要的结果,但我觉得让线程随机休眠一段时间是获得我想要的输出的一种混乱方式,而且出错的可能性仍然很小。有没有更清洁的方法来做到这一点?

最后注:这是我第一次在这里发帖,所以如果我做错了什么,请告诉我。

编辑:稍微修正了代码

【问题讨论】:

  • 为了澄清,您的代码第 3 行的右括号是故意的吗?
  • 哦,糟糕,我错过了。当我复制并粘贴代码时,我遗漏了所有内容所在的 try 块,但我一定是意外抓住了右括号。第 3 行的大括号是有意的,但最底部的大括号不是。我将对其进行编辑并修复缩进。

标签: java multithreading methods concurrency synchronized


【解决方案1】:

您只需要在共享锁对象上进行同步:

private static final Object LOCK = new Object();

public void foo() {
    synchronized(LOCK) {  
        ...
    }
}

【讨论】:

  • 是的,这正是我想要的。谢谢。
猜你喜欢
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
相关资源
最近更新 更多