Java互斥实现

Java互斥实现,java,Java,我正在用Java实现互斥,代码如下所示,我不知道为什么结果不符合我的预期, 正如您在我展示的结果中所看到的,它的运行是不可预测的 enum MutexStatus { FREE, BUSY }; enum FunctionTypes { INCREASE, DECREASE }; class Mutex { private MutexStatus mutexStatus; public Mutex() { mutexStatus =

我正在用Java实现互斥,代码如下所示,我不知道为什么结果不符合我的预期, 正如您在我展示的结果中所看到的,它的运行是不可预测的

    enum MutexStatus {
    FREE, BUSY
};

enum FunctionTypes {
    INCREASE, DECREASE
};

class Mutex {
    private MutexStatus mutexStatus;

    public Mutex() {
        mutexStatus = MutexStatus.FREE;
    }

    public void acquire() {
        synchronized (this) {
            while (mutexStatus == MutexStatus.BUSY)
                ;
            mutexStatus = MutexStatus.BUSY;
        }
    }

    public void release() {
        mutexStatus = MutexStatus.FREE;
    }
}

class MyThread extends Thread {
    private static Mutex mutex = new Mutex();
    private static Integer sharedCounter = 0;
    private FunctionTypes funcType;

    public MyThread(String name, FunctionTypes functionType) {
        super.setName(name);
        funcType = functionType;
    }

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            mutex.acquire();
            switch (funcType) {
            case INCREASE:
                sharedCounter++;
                System.out.println(Thread.currentThread().getName() + " -> "
                        + sharedCounter);
                break;

            case DECREASE:
                sharedCounter--;
                System.out.println(Thread.currentThread().getName() + " -> "
                        + sharedCounter);
                break;
            default:
                break;
            }
            mutex.release();
        }
    }

}

public class MutexImplement {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MyThread IncreaseThread = new MyThread("Increase thread",
                FunctionTypes.INCREASE);
        IncreaseThread.start();

        MyThread DecreaseThread = new MyThread("Decrease thread",
                FunctionTypes.DECREASE);
        DecreaseThread.start();
    }

}
看看17.4英寸。线程将拥有它们共享(或实际上不共享)的变量的本地副本。如前所述,使共享变量不稳定或使用一些同步/并发控制。您可能还需要查看自旋循环(while循环)并使用一些信号


现在Java有很多结构可以为您完成这一切,尽管我怀疑您被要求自己创建互斥。为了记录在案,请尽量避免您自己的自酿,并尝试使用提供的并发结构。

也许这不是代码中的唯一错误,但是您的
mutexStatus
肯定是不稳定的。@Danstahr您可以给一些技巧。acquire()函数也不是线程安全的。例如:
线程A通过while(mutexStatus==mutexStatus.BUSY)
->重新调度到线程B->
线程B通过while(mutexStatus==mutexStatus.BUSY)
->哦…@Danstahr你能给我一个解决这个问题的方案吗,谢谢你的评论,非常有用谢谢你的回复,正如您所看到的,我的互斥变量是静态的,因此它将与所有人共享object@user872342:不,那是不正确的。多个线程将看到不同的互斥状态值,因为它们在不同的内核上执行,每个线程都有一个互斥状态的缓存。您需要应用适当的同步来避免此问题。而且这不是你仅有的一个。共同货币很难。您应该使用该语言和标准API提供的构造,而不是在不了解所有问题的情况下重新创建它们。感谢@JBNizet,我已经使用synchronized修改了我的代码,这是一个好的解决方案吗
>Increase thread -> 1
>Decrease thread -> 0
>Increase thread -> 1
>Decrease thread -> 0
>Decrease thread -> 1
>Increase thread -> 1
>...........