这是我的 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/