3
是否可以同時讀寫套接字?我有一個連續讀取套接字的線程。由於只有一個線程正在從套接字讀取,讀操作是線程安全的。現在我有很多線程(比如100)寫入socket。因此,很明顯,我已經做寫操作線程安全的做這樣的事情,是否有可能同時讀取和寫入java.net.Socket?
package com.mysocketapp.socketmanagement;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class SocketManager {
private Socket socket = null;
private InputStream inputStream = null;
private OutputStream outputStream = null;
public SocketManager() {
socket = new Socket("localhost", 5555);
//server's running on same machine on port 5555
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
}
public void writeMessage(byte[] message) throws IOException {
synchronized (SocketManager.class) {
if (message != null) {
outputStream.write(message);
}
}
}
public byte[] readMessage() throws IOException {
byte[] message = new byte[10]; //messages are of fixed size 10 bytes
inputStream.read(message);
}
}
現在我有一個線程調用不斷readMessage()函數(在while循環)。據我所知,如果在套接字上沒有消息要讀取,語句inputStream.read(message)
將等待消息。
我想知道它是否是安全的exceute outputStream.write(message);
而inputStream.read(message);
是在執行
猜測在SocketManager類或套接字上的同步會有相同的效果,因爲只有一個套接字。 – HariShankar
當您實例化另一個SocketManager時,只有一個在寫入時被阻塞,而不是所有實例。在最小的對象上進行同步更爲明顯。 –