使用java中的多个线程访问多个共享资源

时间:2015-07-13 22:07:51

标签: java

我试图通过两个线程在三个共享数组中插入值。条件是如果一个数组只被一个线程访问但线程可以使用另一个数组。 例如,c1,c2,c3是三个数组,t1和t2是两个线程,那么如果t1使用c1,那么t2不能使用c1,但它可以使用c2或c3。相同的条件适用于t2。 如果有人知道如何编码这种情况,请提供帮助。

2 个答案:

答案 0 :(得分:2)

如评论所述,您可以使用同步块,也可以使用锁定:

        Lock lockA, lockB, lockC;

        ...

        if (lockA.tryLock()) {
            try {
                // write to c1
            } catch (InterruptedException e) {
                // TODO
            } finally {
                lockA.unlock();
            }
        } else if (lockB.tryLock()) {
            try {
                // write to c2
            } catch (InterruptedException e) {
                // TODO
            } finally {
                lockB.unlock();
            }
        } else if (lockC.tryLock()) {
            try {
                // write to c3
            } catch (InterruptedException e) {
                // TODO
            } finally {
                lockC.unlock();
            }
        } else {
           // Cant get to anything as all three are locked!!!
        }

        ...

如果锁可用,则tryLock()方法返回true,并向调用该方法的线程提供锁定,否则返回false。

一旦线程拥有锁,它就可以在数组上执行它所需的操作,并且在此期间没有其他线程可以对该数组执行任何操作。

然后在操作完成后执行unlock()块中的finally方法,然后释放锁并允许其他线程执行该操作。

答案 1 :(得分:0)

此问题是同步问题因此,如果您需要解决此问题,可能会发生并发或相互排斥您应根据您的问题选择其中一种算法和技术。 以下是Java中实现的技术和算法: