我有一个创建多个线程的类,每个线程在构造函数中获取一个socket作为参数。
我需要同步线程,以便在给定时间只有一个线程访问套接字流。
以下是我需要的快速草稿:
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
关键字是否适用于此案例?
答案 0 :(得分:6)
要使用基本同步,您可以使用套接字作为锁,因为它由每个工作人员共享。
public void run() {
synchronized (socket) {
InputStream is = socket.getInputStream();
/* ... */
}
}
如果MyClass
确实需要访问套接字,请在doStuff
中执行相同的同步。
但是,您有效地序列化对套接字的访问并绕过应用程序的多线程方面,因为在run
方法的整个持续时间内保持锁定。