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