java - 如何同步两个方法以防止它们同时被不同线程访问,但只允许一种方法有多个实例

标签 java

如何同步两个方法以防止它们同时被不同线程访问,但又允许仅一个方法有多个实例?

例如,如果我创建了一个交通灯类和一个汽车类。我想要一个 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/

相关文章:

java - 如果字符串包含 get getContents (JXL)

java - 在双链表中插入新元素

java - 在 OSX 上重新安装 Java 7 JDK

java - 将 Java 字符串中的撇号替换为 "\' "

java - 在这种情况下,新的 JVM 实例或反射会有帮助吗

java - 多个小型 Java 数据库事务或一个大型 Java 数据库事务?哪个更快?

java - 在java中使用递归重复值获取字符串列表

java - 使用循环读取数学表达式,分隔数字

Java JTextArea 字体

Java InetAddress.getByName.isReachable() 替代方案