Eğer yöntem processOutbox olmak için, anahtar kelimeyi synchronized
kullanmalısınız:
public class YourClass{
public synchronized void processOutbox(){
//do all you want
}
}
diğer bilgiler de:
YourClass örneğidir https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html denilen kodunuzda Eğer varsa örneğin myInstance
için, processOutbox()
numaralı tüm çağrılar iş parçacığı için güvenli olacak, çünkü bunlar örnek düzeyinde kilitlenecektir. Örneğin
: thread1 çağrıyı için "processOutbox"
Ama bitene kadar bekliyor olacak thead2
İşte
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();
örneğin:
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 olacak DEĞİL beklemeye çünkü farklı örneklerde yöntemi çağırıyorlar.
Özellikle ReentrantLock kullanımı hakkında sorular sordu - Bu yanıtı buna ekliyorum, çünkü bu doğru. Ayrıca bunun yerine tryLock kullanarak engellemek için onları neden olmadan kilit dışı diğer konuları tutmak şey yapabilirsiniz çünkü
public class YourClass {
private Lock outboxLock = new ReentrantLock();
public void processOutbox() {
outboxLock.lock()
try {
// do stuff
} finally {
outboxLock.unlock()
}
}
}
Ben özellikle bu söz.
public class YourClass {
private Lock outboxLock = new ReentrantLock();
public void processOutbox() {
if(outboxLock.tryLock()) {
try {
// do stuff
} finally {
outboxLock.unlock()
}
}
}
}
Zamanlamayı yalnızca kilitlediniz. İcra hala threadafe değildir. – Fildor
Nasıl yaparım? Lütfen tavsiye. – mayooran
Sınıf düzeyinde statik değişken üzerinde senkronize etmenizi öneririm. –