java - 在java中的不同类中的线程之间同步共享变量?

标签 java multithreading synchronization locking

这是我的 NXT 积木。

假设我有两个不同的类,A 类和 B 类,每个类都有自己的线程在运行。

但是,有一个名为MotorA 的静态变量实例由两个类共享。此 MotorA 变量是一个物理电机,其运动可由两个类控制。 A 类和 B 类的线程都可以控制 MotorA 的运动,但我只想让其中一个控制 MotorA一次。

例如,如果类 A 正试图向前旋转 MotorA 而类 B 正试图旋转 MotorA 向后,我只希望 A 类向前旋转 MotorA 并阻止 B 类的作用。

问题:我可以使用同一个锁来同步来自不同类的线程中的方法吗?

最佳答案

是的,你可以。你实际上可以这样做:

  class MotorA {

    private static MotorA motor = new MotorA(); 
    private static final java.util.concurrent.locks.Lock lock = new java.util.concurrent.locks.ReentrantLock();

    private MotorA() { }

    public static MotorA getMotorA() {
    return motor;
    }

    public static Lock getLock() {
    return lock;
    }

    /* here go business methods for MotorA */

 }

接下来,当你想对MotorA实例进行任何操作时,你只需要:

  • 1) 通过getLock() 获取它的锁
  • 2) 在给定实例上调用 Lock.lock()
  • 3) 通过getMotorA()获取MotorA单例
  • 4) 在MotorA实例上执行任何方法
  • 5) 调用Lock.unlock()释放锁。

在这种情况下,多线程对资源的访问是安全的。

或者您可以简单地在 MotorA 的实例上进行同步:

  class UserOfMotor1 {

    public void doOperationInMotor1Thread() {

        synchronized(MotorA.getMotorA()) {

            MotorA motor = MotorA.getMotorA();
            motor.soSth();

        }
    }

  }

但在这种情况下,您还必须在线程使用共享资源时使用 synchronized() block - 在您的情况下为 MotorA。如果您使用这种控制同步的方法,您必须确保您在不同线程中的同一对象上进行同步 - 在这种情况下 MotorA 是一个 Singleton 所以您总能得到同一个实例。

关于java - 在java中的不同类中的线程之间同步共享变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19879931/

相关文章:

java - 您如何从服务中检测到应用程序进程已关闭?

java - 通过 https (Ubuntu 16.04) 设置 Nexus 3

multithreading - 专用服务器与组合客户端-服务器?

c# - TCP/IP .NET 套接字效率

ios - ARC 的多线程自动释放问题?

php - 两种方式mysql数据库同步

java - 使用 AtomicInteger 作为静态共享计数器

java - NTLMv2 HTTP 身份验证 Java

java - 代码、字符串和注释分成多行

mysql - 如何将 Visual Foxpro dbfs 与 MySQL 同步?