use*_*166 4 java multithreading synchronized
我已经阅读了有关同步方法的oracle doc以及它们如何为多线程程序引入锁定,但有一件事我不清楚.对已经锁定的方法的后续调用是否排队?
让我们说我们有一个班级:
class Astore {
...
public synchronized void a() {
doSomethingTimeConsuming();
}
...
}
Run Code Online (Sandbox Code Playgroud)
和3个调用astore.a()的线程
final Astore astore = new Astore();
Thread t1 = new Thread(new Runnable() {
public void run() {
astore.a();
doSomethingElse();
astore.a();
}
});
t1.start();
Thread t2 = new Thread(new Runnable() {
public void run() {
astore.a();
}
});
t2.start();
Thread t3 = new Thread(new Runnable() {
public void run() {
astore.a();
}
});
t3.start();
Run Code Online (Sandbox Code Playgroud)
我不确定我是否正确地做了这个例子,但重点是,3个线程几乎同时使用synchronized方法调用同一个对象.
将操作顺序存储在队列中,以便线程调用将是:
我可以安全地假设这将是行为,或者不能保证这将是顺序(或者更糟糕的是,t2和t3可能以随机顺序被调用)
当多个线程可能需要共享数据时的最佳实践是什么(例如,每个活动连接有一个线程的套接字服务器 - 我不希望6个客户端在等待第一个完成大量上传到共享数据结构)
不,它不会对该方法的调用进行排队.
如果调用是从已经获得锁定的线程(例如,递归调用)进行的,则它将正常进行.
尝试使锁能够进行调用的其他线程将保持在那里并等待锁被释放.
订单无法保证,如果重要,请使用公平的 ReentrantLock.
| 归档时间: |
|
| 查看次数: |
1865 次 |
| 最近记录: |