【发布时间】:2018-03-28 18:56:54
【问题描述】:
我有以下三个课程。 Main、两个线程和方法同步的 Obj
public class DeadLocks {
public static void main(String[] args) {
SyncObj so = new SyncObj();
ThreadObj to = new ThreadObj(so);
ThreadObj1 to1 = new ThreadObj1(so);
to.start();
to1.start();
}
}
class SyncObj {
synchronized void foo() {
System.out.println("Foo Started");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
bar();
}
synchronized void bar() {
System.out.println("bar started");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
foo();
}
}
class ThreadObj1 extends Thread {
SyncObj so;
public ThreadObj1(SyncObj so) {
this.so = so;
}
@Override
public void run() {
so.bar();
}
}
class ThreadObj extends Thread {
SyncObj so;
public ThreadObj(SyncObj so) {
this.so = so;
}
@Override
public void run() {
so.foo();
}
}
在上面的代码中,我在同一个对象上调用同步方法。两个方法同时执行和调用,不存在死锁情况。谁能解释为什么?抱歉问了这么愚蠢的问题。
【问题讨论】:
-
同步块是可重入的。一旦一个线程在
SynckObj上获得锁定,它就可以调用相同对象的同步方法而无需等待锁定。 -
这里只有一把锁。你不能只用一把锁死锁,至少需要两把。所以两个线程只是轮流访问单个对象。
-
@markspace 根据我的理解,同步关键字用于锁定方法而不是对象。在这里,我锁定了 2 种方法。访问同一个对象可以同时对
-
你的理解是错误的,它锁定了对象。这里只有一把锁。请注意下面 Khanna11 的回复。
标签: java multithreading synchronized