这是给我的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实例上执行任何操作时,您只需要:
getLock()
getMotorA()
获取MotorA单例MotorA
实例在这种情况下,从多个线程对资源的访问将是安全的。
或者,您可以仅在MotorA实例上进行同步:
class UserOfMotor1 {
public void doOperationInMotor1Thread() {
synchronized(MotorA.getMotorA()) {
MotorA motor = MotorA.getMotorA();
motor.soSth();
}
}
}
但是在这种情况下,每当线程使用共享资源时,您还必须使用
synchronized()
块-在您的情况下为MotorA
。如果使用这种控制同步的方法,则必须确保在不同线程中的同一对象上进行同步-在这种情况下,MotorA
是Singleton
,因此您始终会获得相同的实例。