java - 互斥使用JAVA 2-Threads解决方案

标签 java multithreading mutual-exclusion

我正在尝试使用 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++;
        }
    }

}

最佳答案

您的代码中有两个问题。

  1. if(!locked) 和 set locked=true 不是原子操作,这 意味着两个线程可以发现它没有锁定并同时锁定它。
  2. 变量 lockedcurrent 没有同步,所以一个 线程可能无法读取其他线程在其上设置的新值 因为memory barriar .

你可以用 AtomicBooleanvolatile 解决这个问题:

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/

相关文章:

java - 如何使用java代码在unix服务器中创建文本文件?

java - 为什么此输出会打印一个空白文件?

java - 如何在 H2 中将周数格式化为所需格式

multithreading - 在私有(private)/后台队列 : how to do? 上创建 NSManagedObjectContext

Java 原子变量 native /内部实现

multithreading - 德克算法

windows - Citrix 环境中跨用户 session 的互斥

java - 限制打开的最大文件大小

python - 如何计算自 python 程序启动以来已经过去了 1 小时?

python - Flask 返回响应后执行一个函数