Когда вы используете Google для многопоточного сервера Java , в большинстве случаев вы получаете решение, основанное на следующем шаблоне:
public class MultiThreadServer implements Runnable {
private Socket socket;
MultiThreadServer(Socket socket) {
this.socket = socket;
}
public static void main(String args[]) throws Exception {
ServerSocket serverSocket = new ServerSocket(4444);
while (true) {
new Thread(new MultiThreadServer(serverSocket.accept())).start();
}
}
public void run() {
// ...
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
// ...
}
}
Как это связано с представленными идиомами безопасной публикации в Java Concurrency in Practice ?
Для безопасной публикации объекта оба открытый класс MultiThreadServer реализует Runnable {частный сокет Socket; ...
Когда вы используете Google для многопоточного сервера Java , в большинстве случаев вы получаете решение, основанное на следующем шаблоне:
public class MultiThreadServer implements Runnable { private Socket socket; MultiThreadServer(Socket socket) { this.socket = socket; } public static void main(String args[]) throws Exception { ServerSocket serverSocket = new ServerSocket(4444); while (true) { new Thread(new MultiThreadServer(serverSocket.accept())).start(); } } public void run() { // ... PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader( new InputStreamReader( socket.getInputStream())); // ... } }
Как это связано с представленными идиомами безопасной публикации в Java Concurrency in Practice ?
Для безопасной публикации объекта оба открытый класс MultiThreadServer реализует Runnable {частный сокет Socket; ...
Когда вы используете Google для многопоточного сервера Java , в большинстве случаев вы получаете решение, основанное на следующем шаблоне:
public class MultiThreadServer implements Runnable { private Socket socket; MultiThreadServer(Socket socket) { this.socket = socket; } public static void main(String args[]) throws Exception { ServerSocket serverSocket = new ServerSocket(4444); while (true) { new Thread(new MultiThreadServer(serverSocket.accept())).start(); } } public void run() { // ... PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader( new InputStreamReader( socket.getInputStream())); // ... } }
Как это связано с представленными идиомами безопасной публикации в Java Concurrency in Practice ?
Для безопасной публикации объекта оба ссылка на объект и состояние объекта должно быть видимым для другие потоки одновременно. А правильно построенный объект может быть безопасно опубликовано:
- Инициализация ссылки на объект из статический инициализатор.
- Сохранение ссылка на него в изменчивое поле.
- Сохранение ссылки на него в окончательном поле.
- Сохранение ссылки на него в поле, которое должным образом охраняется (синхронизированная) блокировка.
Действительно ли безопасно использовать
сокет
в методеrun ()
без дополнительной синхронизации, безопасно ли это опубликовано? Пожалуйста, напишите больше, чем просто да или нет .