假设我有一个有两个方法的对象A:
public doSomething()
{....}
public synchronised doSomethingElse()
{ ... }
我有thread1.doSomethingElse()
,thread2.doSomething()
是否仍然可以执行或被thread1锁定阻止?
如果是这样,我怎样才能让thread1同时执行?
答案 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同时运行。您无需做任何特殊操作。