java - 使用同步方法的类的多个实例

标签 java multithreading methods concurrency synchronized

我现在正在编程一些东西,其中一个对象的多个实例都在单独的线程中运行。我想要一种同步方法,一次只能执行一个对象的实例化。我知道 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/

相关文章:

Java 当我将参数传递给此方法时,在执行该方法中的任何代码之前,它被错误地除以我的常量之一

java - 如何从具有 NTLM 身份验证的 Java 客户端调用基于 .Net 的 Web 服务

java - JIT如何调度字节码的执行?

c++ - 从工作线程访问共享数据

c++ - 为什么在调用 pthread_cond_broadcast 后调用 pthread_cond_wait 不立即返回?

java - 调用扩展 JButton 类中的方法时找不到符号错误

Java Swing - 如何制作下一个和上一个按钮来显示数组中对象的变量?

java - 从 Scanner 获取输入时 Maven 挂起

ruby - 是什么导致我的 Ruby `trap` block 出现这种死锁?

asp.net - 是否可以通过 ASPX 页面调用方法背后的 Silverlight 代码?