在Java中的DIFFERENT类中的线程之间同步共享变量?

use*_*438 5 java multithreading synchronization locking

这是我的NXT砖.

假设我有两个不同的类,Class A和Class B,每个类都运行其OWN线程.

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

例如,如果Class A正在尝试MotorA向前旋转而Class B试图MotorA向后旋转,我只希望Class 向前A旋转MotorA并阻止Class B的效果.

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

Art*_*lev 3

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

  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 */

 }
Run Code Online (Sandbox Code Playgroud)

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

  • 1)通过以下方式检索其锁getLock()
  • 2) 在给定实例上调用 Lock.lock()
  • 3)通过以下方式获取MotorA单例 getMotorA()
  • MotorA4)在实例 上执行任何方法
  • 5)调用Lock.unlock()释放锁。

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

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

  class UserOfMotor1 {

    public void doOperationInMotor1Thread() {

        synchronized(MotorA.getMotorA()) {

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

        }
    }

  }
Run Code Online (Sandbox Code Playgroud)

synchronized()但在这种情况下,每当线程使用共享资源时,您还必须使用block - 在您的情况下MotorA。如果您使用这种控制同步的方法,则必须确保在不同线程中的同一对象上进行同步 - 在本例中MotorA是 a Singleton,因此您始终获得相同的实例。