![](/img/trans.png)
[英]How to use CountDownLatch/Synchronized on an object that is being accessed by multiple threads?
[英]Synchronized object in multiple threads
我有一個創建多個線程的類,每個線程在構造函數中獲取一個套接字作為參數。
我需要同步線程,以便在給定的時間只有一個線程訪問套接字流。
這是我需要的快速草稿:
class MyClass{
Socket socket;
public MyClass() {
socket = new Socket(address, port);
}
void createThread(){
Worker worker = new Worker(socket);
Thread t = new Thread(worker);
t.start();
}
void doStuff(){
InputStream is = socket.getInputStream();
/* ... */
}
}
class Worker implements Runnable{
Socket socket;
public Worker(Socket socket){
this.socket = socket;
}
@Override
public void run() {
InputStream is = socket.getInputStream();
/* ... */
}
}
現在在這里,潛在的多個線程可以同時訪問套接字輸入流,這將是非常糟糕的。
現在,我的問題是:在這種情況下, synchronized
關鍵字是否有效?
要使用基本同步,您可以將套接字用作鎖,因為它由每個工作程序共享。
public void run() {
synchronized (socket) {
InputStream is = socket.getInputStream();
/* ... */
}
}
如果MyClass
確實還需要訪問套接字,請在doStuff
執行相同的同步。
但是,由於鎖是在run
方法的整個過程中保持的,因此您可以有效地序列化對套接字的訪問並繞過應用程序的多線程方面。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.