同步問題:的Java HashSet的同步查詢
Set s = Collections.synchronizedSet(new HashSet());
private Object monitor_ = new Object();
//Set has element added in another routine...
//Called by some thread1, thread2, ...
TimerTask run(){ //method which executes every 1 min
synchronized(monitor_) {
s.isEmpty()
// ...
// waits for 30 seconds
// JNI call
// ...
}
}
//Called by cleanup thread
removecall()
{
synchronized(monitor_) {
s.remove(something);
}
}
Problem:
雖然TimerTask的run方法在執行清除線程必須等待。任何有效的方式 來處理這種情況,不得不等待。例如可重入鎖
您能不能給我們'TimerTask.run()'的內容是什麼? –
你的問題不是很清楚。要麼你需要timertask和cleanup線程中的2個操作是同步的,或者你不需要。如果您的目的僅僅是保證線程安全地訪問您的集合,那麼在使用synchronizedSet之前不需要額外的同步。 – assylias
@assylias是希望安全訪問set,但是按照java doc http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html#synchronizedSet(java.util.Set ) 用戶在迭代時手動同步返回的集合是非常重要的。 – Sandy