Cuando usar @ volátil y sincroniza

Sé que hay muchas preguntas sobre esto, pero aún no entiendo del todo. Sé lo que hacen estas dos palabras clave, pero no puedo determinar cuál usar en ciertos escenarios. Aquí hay un par de ejemplos que estoy tratando de determinar cuál es el mejor para usar.

Ejemplo 1

import java.net.ServerSocket;

public class Something extends Thread {

    private ServerSocket serverSocket;

    public void run() {
        while (true) {
            if (serverSocket.isClosed()) {
                ...
            } else { //Should this block use synchronized (serverSocket)?
                //Do stuff with serverSocket
            }
        }
    }

    public ServerSocket getServerSocket() {
        return serverSocket;
    }

}

public class SomethingElse {

    Something something = new Something();

    public void doSomething() {
        something.getServerSocket().close();
    }

}

Ejemplo 2:

public class Server {

    private int port;//Should it be volatile or the threads accessing it use synchronized (server)?

    //getPort() and setPort(int) are accessed from multiple threads
    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

}

Cualquier ayuda es muy apreciada

Respuestas a la pregunta(10)

Su respuesta a la pregunta