如果对象的一个方法是同步的而另一个方法不同步,那么两个不同的线程可以同时运行它们吗?我知道当一个方法被标记为同步时,必须获取内部锁,但第二种方法不同步,这有关系吗?或者,如果一个线程获得锁定,则无法输入所有方法?
答案 0 :(得分:1)
是。两个线程可以同时执行这两个方法。线程可以锁定同步方法,但执行非同步方法不需要锁定。
答案 1 :(得分:1)
我确信这两个方法可以在同一个对象上同时运行,因为synchronized
的方法只能使用该对象的内部锁。获得它,但由于非同步方法不能使用锁,它们都可以同时运行。我遇到了同样的场景&发现约会陈述是正确的。有关更清晰的信息,请参阅以下示例:
class LockTest {
// Sync Method. Will acquire the lock
public synchronized void meth1() {
System.out.println(Thread.currentThread().getName()
+ " is executing method1.");
try {
Thread.sleep(1000); // to show some processing, Won't release the
// lock
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out
.println(Thread.currentThread().getName() + " ended method1.");
}
// No lock is required in this method
public void meth2() {
try {
Thread.sleep(1);// to let meth1 execute first & acquire the lock
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ " is executing method2.");
System.out
.println(Thread.currentThread().getName() + " ended method2.");
}
public static void main(String[] args) throws Exception {
final LockTest oracle = new LockTest();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
oracle.meth1();
}
}, "BigThread");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
oracle.meth2();
}
}, "SmallThread");
t1.start();
t2.start();
t1.join();
t2.join();
}
}
上面的代码生成输出为:
BigThread is executing method1.
SmallThread is executing method2.
SmallThread ended method2.
BigThread ended method1.
输出显示method2
执行时method1
同时也在同一个对象oracle
上执行。