使用并发锁来锁定数组的特定索引-RentrantLock

问题描述

因此,我正计划让多个线程访问作为2D数组的共享资源。 每个对象将一次访问一个索引以设置对象的内容,如下所示。

单元是数组的每个对象组成的。

RandomObject只是将在Cell内的类的临时名称

所以这段代码的目的是检查矩阵是否被占用,因此是否为空。

public class Cell
{
    private reentrantlock lock;
    private RandomObject currentObject;
    
    public Cell()
    {
        lock = new reentrantlock();
    }
    
    public boolean hasRandomObject()
    {
        boolean successfulLock = lock.tryLock();
        boolean randomObjectStatus = false;
        
        if (successfulLock)
        {
            if (currentObject != null)
            {
                randomObjectStatus = true;
            }
            System.out.println("Lock released.");
        }
        return randomObjectStatus;
    }
    
    public boolean setRandomObject(RandomObject inRandomObject)
    {
        boolean successfulLock = lock.tryLock();
        
        if (successfulLock)
        {
            if (currentObject != null)
            {
                successfulLock = false;
            }
            else
            {
                currentObject = inRandomObject;
            }
            //Inner lock release
            lock.unlock();
        }
        return successfulLock;
    }

    public boolean remove()
    {
        boolean successfulLock = lock.tryLock();
        
        if (successfulLock)
        {
            if (currentObject != null)
            { 
                currentObject.endThread();
                currentObject = null;
            }
            lock.unlock();
        }
        
        return successfulLock;
    }
}
public class Map
{
    private Cell[][] map;
    private int width,height;
    
    public Map(int inRowSize,int inColumnSize)
    {
        map = new Cell[inRowSize][inColumnSize];
        width = map.length;
        height = map[0].length;
        
        for (int i = 0; i < map.length; i++)
        {
            System.out.println(map[i].length);
            for (int j = 0; j < map[i].length; j++)
            {
                map[i][j] = new Cell();
            }
        }
    }
}

那么一点点背景。

  1. 一次只能在一个单元格中放置一个对象,因此如果设置时该对象不为null,则返回false。这样我才能知道它已经被占用。

  2. endThread只是RandomObject内部的一种用于结束线程的方法,因为每个RandomObject都有自己的线程。

  3. 包括Map类只是为了添加有关Array是什么的上下文。

只想检查一下我是否正确使用了可重入锁,并使此类成为Threadsafe类,因为可能有1 .. *个线程试图占据这些单元格。

也希望讨论有关任何更好的选项,优化或改进的意见。

我通常使用监视器,并希望使用ConcurrentLocks来添加功能,因此我可以访问tryLock来立即知道它是否成功。

干杯。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)