了解具有线程和同步的共享对象

时间:2013-12-18 14:01:24

标签: java multithreading reference

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

我不太确定这仍然有效,所以我想问一下:

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

Math m = new Math();

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

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

Math m = new Math();

他们不会使用相同的同步方法吗?

3 个答案:

答案 0 :(得分:1)

不,他们没有使用相同的方法。但它可以依赖于Math对象。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您需要了解的唯一事项是Class级别锁定和Instance级别锁定。

1。实例级别锁定

与第一种情况一样,所有线程共享同一个对象,因此每个线程都需要获得唯一一个能够调用这些方法的锁。

e.g。

Class Math {
    synchronized public void add(){}
    synchronized public void decrease(){}
}

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

2。班级锁定

Class Math {
    synchronized public static void add(){}
    synchronized public static void decrease(){}
}

在这种情况下,可以在不创建数学对象的情况下调用adddecrease,它们是类级别锁,所有线程使用Math.addMath.decrease都应获取同样的锁。