难道不应该等到同步对象解锁吗?
锁由thread持有,因此您在其上同步两次(在第一次调用 in 的情况下doSomething
)这一main
事实并不重要,它在同一个线程上。如果另一个线程随后尝试进入synchronized
上的块objToSync
,则该其他线程将等待直到该线程释放其所有锁。
您的代码将执行此操作:
- 进入
main
objToSync
获取对象上当前线程的锁
- 输出“某物”
- 称呼
doSomething
- 为当前线程获取第二个锁
objToSync
- 输出“东西二”
- 释放当前线程的第二个锁
objToSync
- 从返回
doSomething
- 输出“三点”
- 释放当前线程的第一个锁
objToSync
- 称呼
doSomething
- 获取一个新的锁(对于同一个线程)
objToSync
- 输出“东西二”
- 释放那个锁
- 从返回
doSomething
- 从返回
main
这是一个使用两个线程的示例:
public class SyncExample {
private static Object objToSync = new Object();
public static final void main(String[] args) {
Thread second;
System.out.println("Main thread acquiring lock");
synchronized (objToSync) {
System.out.println("Main thread has lock, spawning second thread");
second = new Thread(new MyRunnable());
second.start();
System.out.println("Main thread has started second thread, sleeping a moment");
try {
Thread.currentThread().sleep(250);
}
catch (Exception e) {
}
System.out.println("Main thread releasing lock");
}
System.out.println("Main thread sleeping again");
try {
Thread.currentThread().sleep(250);
}
catch (Exception e) {
}
System.out.println("Main thread waiting for second thread to complete");
try {
second.join();
}
catch (Exception e) {
}
System.out.println("Main thread exiting");
}
static class MyRunnable implements Runnable {
public void run() {
System.out.println("Second thread running, acquiring lock");
synchronized (objToSync) {
System.out.println("Second thread has lock, sleeping a moment");
try {
Thread.currentThread().sleep(250);
}
catch (Exception e) {
}
System.out.println("Second thread releasing lock");
}
System.out.println("Second thread is done");
}
}
}
输出:
主线程获取锁
主线程有锁,产生第二个线程
主线程已经启动了第二个线程,睡了一会儿
第二个线程运行,获取锁
主线程释放锁
主线程再次休眠
第二个线程有锁,睡一会儿
主线程等待第二个线程完成
第二个线程释放锁
第二个线程完成
主线程退出