说我有一个服务器与多个线程共享一个数据实例的引用。快速例如,同步方法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'。或阅读更多。多得多。 –
另外,不要'扩展线程'。 –
另外,格式化您的代码。请。这几乎是难以辨认的。 –