Многопоточный сервер Java против безопасной публикации

Когда вы используете 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 () без дополнительной синхронизации, безопасно ли это опубликовано? Пожалуйста, напишите больше, чем просто да или нет .

1
задан lukem00 3 October 2010 в 21:58
поделиться