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