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类的线程中的方法吗?
是的你可以。你实际上可以这样做:
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实例进行任何操作时,您只需要:
getLock() getMotorA() MotorA4)在实例 上执行任何方法在这种情况下,多线程对资源的访问将是安全的。
或者您可以简单地在 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,因此您始终获得相同的实例。