我正在尝试使用 LockOne(互斥)算法实现 2 线程解决方案。实现这个算法,我正在尝试制定一个定义我自己的锁定方法的线程,但我没有得到所需的输出。当我运行程序时..我得到的输出是“Thread-0 Locked”和“Thread-1 Locked”..任何人都可以让我知道我哪里出错了吗?我的代码在下面给出
public class Main {
static MyLock lock=null;
static int count=0;
public static void main(String[] args) throws InterruptedException {
Thread[] threads=new Thread[2];
threads[0]=new Thread(new MyThread());
threads[1]=new Thread(new MyThread());
lock=new MyLock();
threads[0].start();
threads[1].start();
threads[0].join();
threads[1].join();
System.out.println(count);
}
}
public class MyLock{
private boolean locked=false;
private String current;
public void lock() {
if(!locked){
locked=true;
current=Thread.currentThread().getName();
}
System.out.println(Thread.currentThread().getName()+" locked");
while(locked && current!=Thread.currentThread().getName());
}
public void unlock() {
System.out.println(Thread.currentThread().getName()+" unlocked");
locked=false;
}
}
public class MyThread implements Runnable{
@Override
public void run() {
int i=1;
while(i<=100){
Main.lock.lock();
Main.count++;
Main.lock.unlock();
i++;
}
}
}
最佳答案
您的代码中有两个问题。
if(!locked)
和 setlocked=true
不是原子操作,这 意味着两个线程可以发现它没有锁定并同时锁定它。- 变量
locked
和current
没有同步,所以一个 线程可能无法读取其他线程在其上设置的新值 因为memory barriar .
你可以用 AtomicBoolean
和 volatile
解决这个问题:
import java.util.concurrent.atomic.AtomicBoolean;
public class MyLock{
private AtomicBoolean locked = new AtomicBoolean(false);
private volatile String current;
public void lock() {
for (;;) {
if(!locked.get()){
if (locked.compareAndSet(false, true)) {
current = Thread.currentThread().getName();
System.out.println(current + " locked");
return;
}
}
}
}
public void unlock() {
System.out.println(current + " unlocked");
locked.set(false);
}
}
关于java - 互斥使用JAVA 2-Threads解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48392147/