如何在Java中同时访问同一对象的两种不同方法?

时间:2013-10-24 15:32:35

标签: java multithreading concurrency

我有一个用例,我想将复杂的计算分成两部分(用两种不同的方法)并同时计算它们。换句话说,我会有一个这样的课程:

class A 

public synchronized double computeOne {****};

public synchronized double computeTwo {****};

我可以启动两个线程,并让threadA运行computeOne,threadB运行computeTwo(一个是classA的同一个实例)?

我觉得这样做不会有效,因为只有一种方法可以在A类的特定实例中获取监视器。

那么......如何通过并发功能实现我的目标?

2 个答案:

答案 0 :(得分:3)

您不必在对象上使用锁,您可以指定单独的锁:

class A {
    private final Object lock1 = new Object();
    private final Object lock2 = new Object();

    public double computeOne {
        synchronized(lock1) {
            ****
        }
    }

    public double computeTwo {
        synchronized(lock2) {
            ****
        }
    } 
}

这假设这两种方法不会通过篡改对方使用的状态而相互干扰。你想要同时调用这些东西表明这个对象可能会被重新设计并分成具有更集中责任的单独对象。

无论如何,建议在内部锁上进行同步,这样不仅可以发生任何事情并获得锁定。

最好是你可以从计算中删除任何状态,这样你就可以完全避免锁定。如果唯一的状态是该方法的本地状态,那么您不必锁定。

答案 1 :(得分:1)

使用java.util.concurrent

的Nathan代码
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;

public static class A {
    private final Lock lock1 = new ReentrantLock();
    private final Lock lock2 = new ReentrantLock();

    public void computeOne() {
        try {
            lock1.lock();
            // your code
        } finally {
            lock1.unlock();
        }
    }

    public void computeTwo() {
        try {
            lock2.lock();
            // your code
        } finally {
            lock2.unlock();
        }
    }
}