說我有一個服務器與多個線程共享一個數據實例的引用。快速例如,同步方法vs ReentrantLock
EDIT1:更新了可讀性
public void main() {
Data data = new Data();
ReentrantLock rl = new ReentrantLock(true);
ReadThread t1 = new ReadThread(data, rl);
UploadThread t2 = new UploadThread(data, rl);
t1.start(); t2.start();
}
class ReadThread extends Thread {
private Data data;
private ReentrantLock lock;
ReadThread(Data d, ReentrantLock l){ data = d; lock = l; }
void run(){
lock.lock();
try{
data.put(aString)
} finally { lock.unlock(); }
}
}
class UploadThread extends Thread {
private Data data;
private ReentrantLock lock;
UploadThread(Data d, ReentrantLock l){ data = d; lock = l; }
void run(){
lock.lock();
try{
data.put(aString)
} finally { lock.unlock(); }
}
}
是更好地使用鎖像上面,或同步像下面的put方法,
class Data {
private LinkedList<String> data = new LinkedList<String>();
synchronized void put(String x){ data.add(x); }
}
這是相當粗糙,
我大多隻關心併發性。
使用同步方法我是否正確地假設在類的「Data」實例/對象上會發生同步?因此一個UploadThread可以調用put過程/方法,一個ReadThread可以並行執行相同的操作。然而,使用ReentrantLock示例,只有一個線程可以在任何時候執行put電話嗎?
如果在「數據」類中,我將LinkedList設置爲靜態,並且使put方法同步且靜態,會發生什麼?哪種方法最好?如果我將事物變爲靜態,我是否會失去mut?
您正在使用'Lock'錯誤。鑑於此,使用'synchronized'。或閱讀更多。多得多。 –
另外,不要'擴展線程'。 –
另外,格式化您的代碼。請。這幾乎是難以辨認的。 –