我现在正在编程一些东西,其中一个对象的多个实例都在单独的线程中运行。我想要一种同步方法,一次只能执行一个对象的实例化。我知道 synchronized
关键字不起作用,因为它只适用于对象的单个实例化,并且使整个方法static
并不是真正的选择。目前,我使用的是 static
boolean
,线程检查该方法是否与 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
占用
是在我的对象的 4 个实例化之间共享的静态变量。
这让我得到了想要的结果,但我觉得让线程 hibernate 一段随机的时间是获得我想要的输出的一种困惑的方式,而且仍然有很小的机会出错。有没有更干净的方法来做到这一点?
最后一点:这是我第一次在这里发帖,所以如果我做错了什么,请告诉我。
编辑:稍微修复了代码
最佳答案
您只需要在共享锁对象上进行同步:
private static final Object LOCK = new Object();
public void foo() {
synchronized(LOCK) {
...
}
}
关于java - 使用同步方法的类的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52896002/