java - Java 如何同时访问同一个对象的两个不同方法?

标签 java multithreading concurrency

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

class A 

public synchronized double computeOne {****};

public synchronized double computeTwo {****};

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

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

那...我如何使用并发功能来实现我的目标?

最佳答案

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

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

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

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

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

无论如何,在内部锁上进行同步是一种推荐的做法,这样不仅任何东西都可以出现并获得锁。

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

关于java - Java 如何同时访问同一个对象的两个不同方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19570230/

相关文章:

java - kryo的核心技术是什么?

java - 使用 Spring REST 的自定义错误响应

java - 已 sleep 线程上的 Sleep() 方法

c - 用于 win32/C 的线程生产者/消费者的阻塞队列

concurrency - Erlang的rpc的区别:multicall/4 vs rpc:pmap/3

go - 为什么 Go 在写入封闭 channel 时会感到 panic ?

Java - 一旦发生 2 个 Callables 中的任何一个错误,就捕获错误

java - URL 模式不适用于 localhost url(没有 maven 的 jersey)

java - 通过类传递图像或在每个类中重新创建图像(android)更好吗?

c - 释放线程内存