假設有一個 Thread 并且它有一系列要執行的方法:
public void task(){
method();
method();
method();
method();
}
我想鎖定整個序列。也就是說,當它task()執行時,我不希望其他執行緒執行相同的操作method(),而是等到整個task()完成。需要什么樣的鎖?
uj5u.com熱心網友回復:
您可以使該任務同步:
public synchronized void task() {
method();
method();
method();
method();
}
這將防止其他執行緒task()在同一物件上呼叫相同的方法,包括該物件上的其他synchronized方法。您可以使用顯式synchronized陳述句進行更多控制,例如
public void task() {
synchronized (this) { // or another object
method();
method();
method();
method();
}
}
或者使用你自己的Lock實體:
private final ReentrantLock lock = new ReentrantLock();
public void task() {
lock.lock(); // block until lock is released
try {
method();
method();
method();
method();
} finally {
lock.unlock();
}
}
如果您不想讓所有method()呼叫同時運行,只需將相同的機制應用于method()宣告:
public synchronized void method() // or one of the other two options
如果您將這三種機制中的一種應用于taskand method,您將確保執行緒呼叫task()將按順序完成所有method()呼叫并防止其他執行緒method()同時呼叫任何執行緒。兩者都synchronized允許ReentrantLock同一個執行緒多次獲得相同的鎖/監視器(嵌套鎖)。
最后,如果您想允許多個并行呼叫method()但不允許 whiletask()執行,您需要一個共享或讀寫鎖(請參閱ReentrantReadWriteLock)。
uj5u.com熱心網友回復:
這可能是一種選擇,但可能不是最好的。您可以通過method()以下方式修改您的簽名:
public void method(int serialExecutionCount) {
synchronized(this) {
for (int i = 0; i < serialExecutionCount; i ) {
// body of your method()
}
}
}
現在,您的task()方法將是這樣的:
public void task() {
method(4);
}
現在,如果你像這樣從其他執行緒呼叫它:
method(1);
它將等待從task()方法的呼叫執行緒完成前 4 個方法呼叫。
uj5u.com熱心網友回復:
您需要擁有某種共享鎖,并將其參考傳遞給需要執行序列的所有執行緒。
例如,public static final ReentrantLock LOCK = new ReentrantLock();在具有 task() 方法的類上創建一個,并在方法 task() 的開頭寫入LOCK.lock();,LOCK.unlock();最后寫入。現在,所有通過 task() 方法的執行緒都將嘗試獲取鎖,如果它已經被占用,它將阻塞它們。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/447438.html
