我是Java新手,阅读有关同步的问题我有一个问题
我不太确定这仍然有效,所以我想问一下:
e.g。我有一个名为'Math'的类,其中包含添加和删除的同步方法 然后创建它的对象
Math m = new Math();
然后我启动3个线程并将此对象(m)传递给所有人。 我知道它们将工作在同一个对象中,每个线程将按预期排队
但是如果每个线程都创建了自己的对象呢?
Math m = new Math();
他们不会使用相同的同步方法吗?
答案 0 :(得分:1)
不,他们没有使用相同的方法。但它可以依赖于Math对象。
答案 1 :(得分:0)
如果每个线程都创建了自己的Math对象,那么它们将彼此独立;它们不会被共享 - 因此不能使用相同的同步方法(除非它们是Mani指出的静态方法)。但是,如果Math对象具有在synchronized方法中使用的静态成员,请小心 - 如果任何方法改变了它的状态,您仍然需要在它周围提供一个锁定构造。
答案 2 :(得分:0)
您需要了解的唯一事项是Class
级别锁定和Instance
级别锁定。
与第一种情况一样,所有线程共享同一个对象,因此每个线程都需要获得唯一一个能够调用这些方法的锁。
e.g。
Class Math {
synchronized public void add(){}
synchronized public void decrease(){}
}
add
和decrease
都是实例方法。因此,如果两个线程在不同的实例中运行,它们将不会相互影响。
Class Math {
synchronized public static void add(){}
synchronized public static void decrease(){}
}
在这种情况下,可以在不创建数学对象的情况下调用add
和decrease
,它们是类级别锁,所有线程使用Math.add
或Math.decrease
都应获取同样的锁。