这是给我的NXT砖头用的。

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

但是,两个类都共享一个称为MotorA的静态变量实例。此MotorA变量是物理电机,其运动可由这两类控制。 Class A和Class B的线程都可以控制MotorA的运动,但是我只希望它们中的一个可以一次控制MotorA

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

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

最佳答案

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

  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()块-在您的情况下为MotorA。如果使用这种控制同步的方法,则必须确保在不同线程中的同一对象上进行同步-在这种情况下,MotorASingleton,因此您始终会获得相同的实例。

    10-04 12:46