Java 多线程中的同步对象
我有一个创建多个线程的类,每个线程在构造函数中获得一个套接字作为参数 我需要同步线程,以便在给定时间只有一个线程访问套接字流 以下是我需要的快速草稿:Java 多线程中的同步对象,java,multithreading,Java,Multithreading,我有一个创建多个线程的类,每个线程在构造函数中获得一个套接字作为参数 我需要同步线程,以便在给定时间只有一个线程访问套接字流 以下是我需要的快速草稿: class MyClass{ Socket socket; public MyClass() { socket = new Socket(address, port); } void createThread(){ Worker worker = new Worker(socke
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
中执行相同的同步
但是,您实际上是在序列化对套接字的访问,并绕过应用程序的多线程方面,因为锁在
运行
方法的整个过程中一直保持着。也许最好有一个对套接字具有独占访问权的套接字访问类,该类存储所有传入数据。然后,工作人员以同步方式访问此数据