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