Java 通过线程和同步了解共享对象

Java 通过线程和同步了解共享对象,java,multithreading,reference,Java,Multithreading,Reference,我是Java新手,在阅读有关同步的文章时,我有一个问题 我不太清楚这是如何工作的,所以我想问: e、 我有一个名为“Math”的类,其中包含添加和删除的同步方法 然后创建它的一个对象 Math m = new Math(); 我启动3个线程,并将这个对象(m)传递给所有线程。 我知道它们将工作在同一个对象中,每个线程将按预期排队 但是如果每个线程都创建了自己的对象呢 Math m = new Math(); 它们不能使用相同的同步方法,对吗?不,它们不能使用相同的方法。但是它可以依赖于数学对

我是Java新手,在阅读有关同步的文章时,我有一个问题

我不太清楚这是如何工作的,所以我想问:

e、 我有一个名为“Math”的类,其中包含添加和删除的同步方法 然后创建它的一个对象

Math m = new Math();
我启动3个线程,并将这个对象(m)传递给所有线程。 我知道它们将工作在同一个对象中,每个线程将按预期排队

但是如果每个线程都创建了自己的对象呢

Math m = new Math();

它们不能使用相同的同步方法,对吗?

不,它们不能使用相同的方法。但是它可以依赖于数学对象。

如果每个线程都创建了自己的数学对象,那么它们将彼此独立;它们不会被共享——因此不能使用相同的同步方法(除非它们是Mani指出的静态方法)。但是,如果Math对象有一个在同步方法中使用的静态成员,请务必小心——如果任何方法改变了它的状态,您仍然需要在它周围提供一个锁定结构。

这里您需要了解的唯一一件事是
级别锁和
实例
级别锁

1.实例级锁 与第一种情况一样,所有线程共享同一个对象,因此每个线程只需获得一个锁即可调用这些方法

e、 g

add
reduce
都是实例方法。因此,如果两个线程在不同的实例中运行,它们将不会相互影响

2.级别锁
在这种情况下,
add
reduce
可以在不创建数学对象的情况下调用,它们是一个类级锁,所有线程都使用
Math。add
Math。reduce
应该获得相同的锁。

正确,如果方法不是静态的是,则正确。每个线程将在不同的Math实例上持有锁。如果您使用sycn块而不是sycn方法,那么您可以在您的案例中使用相同的对象(如果您没有在方法中处理实例变量)
Class Math {
    synchronized public void add(){}
    synchronized public void decrease(){}
}
Class Math {
    synchronized public static void add(){}
    synchronized public static void decrease(){}
}