如何同步两个方法以防止它们同时被不同线程访问,但又允许仅一个方法有多个实例?
例如,如果我创建了一个交通灯类和一个汽车类。我想要一个 trafficlights.goleft();
和 trafficlights.goright();
。
如何才能使汽车的许多线程可以同时向左运行,但向右被锁定。
目前我已经在方法前面添加了同步关键字,但这完全锁定了它们。
public class Trafficlights{
public synchronized static void crossEast(int num) throws InterruptedException {
System.out.println("Car crossing Eastwards");
Thread.sleep(1000);
System.out.println("Car is now across");
}
public synchronized static void crossWest(int num) throws InterruptedException {
System.out.println("Car crossing westwards");
Thread.sleep(1000);
System.out.println("Car is now across");
}
public static void main(String[] args) {
for (int i =1; i < 20; i++) {
Car car = new Car(i);
car.run();
}
}
}
最佳答案
对非静态方法使用synchronized关键字可以同步调用方法的对象实例。因此,如果您有其他此类方法,它们将像您所描述的那样被锁定。这个概念的关键是要知道什么是锁/信号量。
如果您不希望仅将方法的子集同步到其操作,则必须自己创建一个锁,并且只有这些方法的子集应通过此锁进行同步。
在java中,如果我记得将方法体放在同步块(synchronized block)中的语法:
goLeft() {
synchronized (leftRightLock) {
// Your goLeft code here
}
}
任何对象都可以是锁,但枚举由于其早期的创建属性而成为首选。但在你的情况下,在实例级别创建一些东西在构造函数中,你就很好了。
免责声明:自 1.7 之前的许多年以来,我就不再使用 Java 进行编码,因此对语法持保留态度。我希望有其他更好的方法来实现这一点,但核心概念仍然是 Java 或其他语言。
关于java - 如何同步两个方法以防止它们同时被不同线程访问,但只允许一种方法有多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53782523/