单独的线程可以继续执行由另一个同步的对象吗?

时间:2017-10-05 00:16:42

标签: java multithreading

假设我有一个有两个方法的对象A:

public doSomething()
{....}

public synchronised doSomethingElse()
{ ... }

我有thread1.doSomethingElse()thread2.doSomething()是否仍然可以执行或被thread1锁定阻止?

如果是这样,我怎样才能让thread1同时执行?

2 个答案:

答案 0 :(得分:1)

有两种类型的同步 1.对象级别 2.类级别(类级别同步仅适用于静态方法。)

在您的情况下,由于您的方法不是静态的,因此它是对象级同步。对于对象级同步,您可以同步整个方法,也可以同步某些方法块。

同步一个方法时。它的意思是你的类的同一个对象不能从不同的线程访问你的synchronized方法。因为每个对象只有一个锁。如果你为同一个obj调用了doSomethingElse(),但来自不同的线程。然后它将由一个线程访问。

现在回答你的问题: 因为你的第一种方法不同步,即某事()。如果你为任何线程调用它,或者当你的第一个线程当前在方法中时调用它,它将不会在任何情况下生效。 锁只适用于同步方法

Yourclass obj = new Yourclass();
Thread A = new MyThread(obj);
Thread B =  new MyThread(obj);

...

public void run()
{
  \\do what ever you want
   \\both of your methods will be called.
   \\ call them both here.
}

在这里,我根据你的需要制作了相同的Mythread类对象。你可以创建两个不同的实现线程类的对象,并编写您的运行。 在任何情况下都不会对通话产生任何影响。

答案 1 :(得分:0)

由于线程2没有尝试获取任何锁定,因此它不会被阻止,并且可以与线程1同时运行。您无需做任何特殊操作。