我有一个创建多个线程的类,每个线程在构造函数中获取一个套接字作为参数。
我需要同步线程,以便在给定时间只有一个线程访问套接字流。
这是我需要的草稿:
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
方法的整个持续时间内都持有锁,因此您有效地序列化了对套接字的访问并绕过了应用程序的多线程方面。
关于java - 多线程同步对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20529196/