Nếu bạn muốn chắc phương pháp processOutbox của bạn, bạn nên sử dụng từ khóa synchronized
:
public class YourClass{
public synchronized void processOutbox(){
//do all you want
}
}
Thông tin thêm tại địa chỉ: https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html
Nếu trong mã của bạn, bạn có một thể hiện của YourClass gọi ví dụ: myInstance
, tất cả các cuộc gọi đến processOutbox()
sẽ là chủ đề an toàn vì chúng sẽ bị khóa ở cấp độ thể hiện.
Ví dụ:
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();
Đây thead2 sẽ chờ đợi cho đến khi thread1 kết thúc cuộc gọi đến "processOutbox"
Nhưng ví dụ:
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 sẽ KHÔNG chờ đợi vì họ đang gọi phương thức trên các trường hợp khác nhau.
Một người nào đó được hỏi cụ thể về cách sử dụng ReentrantLock - Vì vậy, tôi sẽ thêm câu trả lời đó vào câu trả lời này vì điều này là chính xác.
public class YourClass {
private Lock outboxLock = new ReentrantLock();
public void processOutbox() {
outboxLock.lock()
try {
// do stuff
} finally {
outboxLock.unlock()
}
}
}
Tôi đề cập cụ thể vì bạn cũng có thể làm mọi thứ, nơi bạn giữ các chủ đề khác ngoài khóa mà không làm cho chúng bị chặn bằng cách sử dụng tryLock thay thế.
public class YourClass {
private Lock outboxLock = new ReentrantLock();
public void processOutbox() {
if(outboxLock.tryLock()) {
try {
// do stuff
} finally {
outboxLock.unlock()
}
}
}
}
Nguồn
2015-09-22 07:04:42
Bạn chỉ khóa lịch biểu. Việc thực hiện vẫn không an toàn. – Fildor
Tôi làm như thế nào? Làm ơn cho lời khuyên. – mayooran
Tôi khuyên bạn nên đồng bộ hóa nó trên biến tĩnh cấp lớp. –