Синхронизация члена сервлета - PullRequest
0 голосов
/ 01 мая 2020

Я реализовал следующий код. Я не могу думать ни о какой проблеме параллелизма, которая могла бы вызвать это, но все еще хочу мнение от экспертов.

Примечание. Контейнер будет создавать только один экземпляр сервлета, а его метод обслуживания будет вызываться несколькими потоками.

В частности, могут ли два потока одновременно вводить метод receiveToken ()? Может ли tokenDetails быть перезаписан несколькими потоками, выполняющими любой из этого кода параллельно?

public class MyServlet extends HttpServlet {    
    private static final long TOKEN_REFRESH_BUFFER_MILLIS = 
                        PropertiesHelper.getLong(PROP_TOKEN_REFRESH_BUFFER, 300000);

    private static Token tokenDetails = null;

    private static long lokenExpiryTime = 0;

    public void service(HttpServletRequest req, HttpServletResponse res) {

            synchronized(this) {
                if(tokenDetails == null || 
                    (lokenExpiryTime - System.currentTimeMillis()) < TOKEN_REFRESH_BUFFER_MILLIS ) {
                    tokenDetails = obtainToken();
                    lokenExpiryTime = System.currentTimeMillis() + tokenDetails.getExpiresIn() * 1000; 
                    LOG.info("Token call returned...");
                } else {
                    LOG.info("Reusing token from cache...");
                }
            }
    .............
    ......
    }

    private synchronized Token obtainToken() throws IOException {
        //Make an HTTP call to obtain token
        ..............
        ..............
        return token;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...