【问题标题】:Sharing common array between multiple threads在多个线程之间共享公共数组
【发布时间】:2020-07-20 01:45:56
【问题描述】:

我正在尝试在 Java 中实现 2 阶段资源锁死锁预防算法。经过多次尝试,我决定创建一个 SimpleProcess 类,该类实现将充当我的线程的 Runnable 接口。 SimpleProcess 的结构有点像这样:

public class SimpleProcess implements Runnable
{
    private int pid; // process id
    private ArrayList<Integer> requiredRes; // originally required resources
    private int[] remainingRes; // resources that are still required
    private boolean status; // whether process is completed running or not

    public SimpleProcess() {
        pid = 0;
        status = false;
    }

    public SimpleProcess(int id, ArrayList<Integer> res) {
        pid = id;
        requiredRes = res;
        remainingres = requiredRes;
        status = false;
    }

    public int getPid() {
        return pid;
    }

    public int[] getRequiredRes() {
        return requiredRes;
    }

    public int[] getRemainingRequiredRes() {
        return remainingRes;
    }

    public boolean getStatus() {
        return status;
    }

    public void run() {
        System.out.println("Process " + pid + " started.");
        // do something
        System.out.println("Process " + pid + " is complete.");
    }

}

我的主类将包含一个变量,该变量包含每个资源的锁定状态。这个变量被实现为final Lock[] locked_res = ReentrantLock[nr]。我需要帮助的是找到一种方法来共享这个相同的变量,其值可以由每个线程更改以在所有线程(SimpleProcess 实例)之间共享。

【问题讨论】:

    标签: java concurrency thread-safety


    【解决方案1】:

    多线程共享可以使用volatile关键字

    【讨论】:

    • 我明确地希望一次只有一个线程来更新共享资源的值。 volatile 仍然是一个不错的选择吗?
    • 可以使用这个选项,但是volatile不保证线程安全,所以需要使用单例模式并加锁
    • 你通常会怎么做?如果我的问题太基本,请见谅。
    • 我通常对与单个服务器共享数据做同样的事情。如果使用集群模式,则使用 Redis+lua。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    相关资源
    最近更新 更多