我正在编程,我有一个对象的多个实例化,它们都在单独的线程中运行。我希望有一个同步方法,一次只能执行对象的一个实例化。我知道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
occupied
是在对象的4个实例之间共享的静态变量。
这为我提供了理想的结果,但是我觉得让线程随机睡眠一段时间是获取所需输出的一种混乱方式,而且出错的机会仍然很小。有没有更清洁的方法可以做到这一点?
最后说明:这是我第一次在这里发帖,所以如果我做错了什么,请告诉我。
编辑:稍微修复了代码
答案 0 :(得分:1)
您只需要在共享锁对象上进行同步:
private static final Object LOCK = new Object();
public void foo() {
synchronized(LOCK) {
...
}
}