如果你想让你的方法 processOutbox,你应该使用关键字synchronized
:
public class YourClass{
public synchronized void processOutbox(){
//do all you want
}
}
更多信息请访问:https ://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html
如果在您的代码中有一个名为的 YourClass 实例myInstance
,则所有调用都processOutbox()
将是线程安全的,因为它们将在实例级别被锁定。
例如:
YourClass myInstance = new YourClass();
Thread thread1 = new Thread(){
public void run(){
myInstance.processOutbox();
}
}
Thread thread2 = new Thread(){
public void run(){
myInstance.processOutbox();
}
}
thread1.start();
thread2.start();
这里 thead2 将等待直到 thread1 完成对“processOutbox”的调用
但例如:
YourClass myInstance = new YourClass();
YourClass myInstance2= new YourClass();
Thread thread1 = new Thread(){
@Override
public void run(){
myInstance.processOutbox();
}
};
Thread thread2 = new Thread(){
@Override
public void run(){
myInstance2.processOutbox();
}
}
thread1.start();
thread2.start();
thead2不会等待,因为它们在不同的实例上调用该方法。
有人特别询问有关使用 ReentrantLock 的问题——所以我将这个回复添加到这个上,因为这个是正确的。
public class YourClass {
private Lock outboxLock = new ReentrantLock();
public void processOutbox() {
outboxLock.lock()
try {
// do stuff
} finally {
outboxLock.unlock()
}
}
}
我特别提到这一点是因为你也可以做一些事情,你可以通过使用 tryLock 来使其他线程不被锁定而不会导致它们阻塞。
public class YourClass {
private Lock outboxLock = new ReentrantLock();
public void processOutbox() {
if( outboxLock.tryLock() ) {
try {
// do stuff
} finally {
outboxLock.unlock()
}
}
}
}